我有一个包含以下内容的R DataFrame df:
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的每个连续电流对之间的差异。这是我写的代码。但是我得到了一些奇怪的结果
library(data.table)
setDT(df)[,mydiff:=diff(df$current),by=Serial N]
print(length(df$current))
我得到以下内容,因为该列的输出很奇怪,我明白了:
2 6 NA NA NA 2 6 NA NA NA
我真正想要的是:
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
. . .
差异是正确的吗?如果没有,怎么解决这个问题(特别是不使用循环)?
答案 0 :(得分:2)
通过申请
aggregate(current ~ Serial.N ,df1, diff)
获得
Serial.N current.1 current.2 current.3
1 B 2 -6 5
2 C -2 4 4
对应
B: 16 - 14 = 2
10 - 16 = -6
15 - 10 = 5
C: 9 - 11 = -2
13 - 9 = 4
17 - 13 = 4
因此diff()
的输出与aggregate()
相结合似乎对我有意义。我可能没有完全理解为什么你期望你描述的输出。
修改强>
如果Serial N
的{{1}} C中的第三个条目是-13而不是13(OP中的数据是矛盾的),结果是
current
似乎更接近所需的输出。
修改2
要向data.frame添加列aggregate(current ~ Serial.N ,df1, diff)
# Serial.N current.1 current.2 current.3
# 1 B 2 -6 5
# 2 C -2 -22 30
,该列可以使用相同mydiff
的连续值之间的差异,而忽略Serial N
值,我们可以使用
NA
这将导致警告(" ...不是替换长度的倍数"),但结果将接近预期输出:
df1$mydiff <- with(df1, ave(current, Serial.N,
FUN = function(x) c(NA, diff(na.omit(x)))))
# 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
值(第4行)。那是因为我们不能忽视NA
并同时保留它们;至少没有对NA
的重大操纵。
希望这有帮助。
数据强>
data.frame