我有一个包含以下内容的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 :(得分:1)
这可能对你有用。您可以使用zoo包中的na.locf来提升值。如果当前不是NA,则ifelse条件仅填充my.diff。
library(data.table)
library(zoo)
df <- read.table(textConnection("
'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"),header=TRUE)
setDT(df)
setkey(df,Serial.N)
df[,my.diff := ifelse(!is.na(current), c(" ",diff(na.locf(current))), NA),by=Serial.N]
# Serial.N year current my.diff
# 1: B 10 14
# 2: B 10 16 2
# 3: B 11 10 -6
# 4: B 11 NA NA
# 5: B 11 15 5
# 6: C 12 11
# 7: C 12 9 -2
# 8: C 12 -13 -22
# 9: C 12 17 30