在 R 中将 diff() 与 NA 和负数一起使用
Using diff() in R with NA and negative numbers
我有一个包含以下内容的 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 的每对连续电流之间的区别。这是代码 I wrote.But我得到了一些奇怪的结果
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
. . .
diff 这样做是正确的吗?如果没有,如何解决这个问题(尤其是不使用循环)?
这可能对你有用。您可以使用 zoo 包中的 na.locf 带来价值。 ifelse 条件仅在当前不为 NA 时填充 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
我有一个包含以下内容的 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 的每对连续电流之间的区别。这是代码 I wrote.But我得到了一些奇怪的结果
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
. . .
diff 这样做是正确的吗?如果没有,如何解决这个问题(尤其是不使用循环)?
这可能对你有用。您可以使用 zoo 包中的 na.locf 带来价值。 ifelse 条件仅在当前不为 NA 时填充 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