首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中使用diff()忽略NA

在R中使用diff()忽略NA
EN

Stack Overflow用户
提问于 2016-03-31 18:39:21
回答 1查看 2.6K关注 0票数 0

我有一个R DataFrame df,其内容如下:

代码语言:javascript
复制
Serial N         year         current
   B              10            14
   B              10            16
   B              11            10
   B              11            NA
   B              11            15
   C              12            11
   C              12             9
   C              12            13
   C              12            17
   .              .              .

我想找出同一序列N的每一对连续电流之间的区别。这是代码i wrote.But,我得到了一些奇怪的结果。

代码语言:javascript
复制
library(data.table)
setDT(df)[,mydiff:=diff(df$current),by=Serial N]   
    print(length(df$current))

我得到了下面的输出,因为这个专栏很奇怪,我得到了以下内容:

代码语言:javascript
复制
2 6  NA NA NA 2 6  NA NA NA 

实际上,我想要的是:

代码语言:javascript
复制
Serial N         year         current      mydiff
   B              10            14         
   B              10            16         16-14=2
   B              11            10         10-16=-4
   B              11            NA            NA
   B              11            15         15-10=5
   C              12            11
   C              12             9         9-11=-2    
   C              12           -13        -13-9=-22
   C              12            17         17-(-13)=30
   .              .              .

那样做是正确的吗?如果不是,如何解决这个问题(特别是不使用循环)?

EN

回答 1

Stack Overflow用户

发布于 2016-03-31 19:15:03

通过应用

代码语言:javascript
复制
aggregate(current ~ Serial.N ,df1, diff)

一个得到

代码语言:javascript
复制
  Serial.N current.1 current.2 current.3
1        B         2        -6         5
2        C        -2         4         4

对应于

代码语言:javascript
复制
B:    16 - 14 =  2
      10 - 16 = -6
      15 - 10 =  5
C:     9 - 11 = -2
      13 -  9 =  4
      17 - 13 =  4

因此,diff()aggregate()的输出对我来说似乎是有意义的。我可能还没有完全理解为什么您期望得到您所描述的输出。

编辑

如果Serial N C中的第三个条目是-13,而不是13 ( OP中的数据是矛盾的),则结果是

代码语言:javascript
复制
aggregate(current ~ Serial.N ,df1, diff)
#   Serial.N current.1 current.2 current.3
# 1        B         2        -6         5
# 2        C        -2       -22        30

这似乎更接近预期的输出。

编辑2

若要将列mydiff添加到data.frame中,该列接受相同Serial N的连续值之间的差异,同时忽略NA值,可以使用

代码语言:javascript
复制
df1$mydiff <- with(df1, ave(current, Serial.N, 
                   FUN = function(x) c(NA, diff(na.omit(x)))))

这将导致一个警告("...not是替换长度的倍数“),但是结果将接近预期的输出:

代码语言:javascript
复制
#  Serial.N year current mydiff
#1        B   10      14     NA
#2        B   10      16      2
#3        B   11      10     -6
#4        B   11      NA      5
#5        B   11      15     NA
#6        C   12      11     NA
#7        C   12       9     -2
#8        C   12     -13    -22
#9        C   12      17     30

mydiff列中的值是正确的,但是缺少一个NA值(在第4行中)。这是因为我们不能忽视NA,同时保存它们;至少在没有对data.frame进行重大操作的情况下是不能的。

希望这能有所帮助。

数据

代码语言:javascript
复制
df1 <- structure(list(Serial.N = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
        2L, 2L, 2L), .Label = c("B", "C"), class = "factor"), year = c(10L, 
        10L, 11L, 11L, 11L, 12L, 12L, 12L, 12L), current = c(14L, 16L, 
        10L, NA, 15L, 11L, 9L, -13L, 17L)), .Names = c("Serial.N", "year", 
        "current"), class = "data.frame", row.names = c(NA, -9L))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36341397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档