我有一个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
. . .那样做是正确的吗?如果不是,如何解决这个问题(特别是不使用循环)?
发布于 2016-03-31 19:15:03
通过应用
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 C中的第三个条目是-13,而不是13 ( OP中的数据是矛盾的),则结果是
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值,可以使用
df1$mydiff <- with(df1, ave(current, Serial.N,
FUN = function(x) c(NA, diff(na.omit(x)))))这将导致一个警告("...not是替换长度的倍数“),但是结果将接近预期的输出:
# 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 30mydiff列中的值是正确的,但是缺少一个NA值(在第4行中)。这是因为我们不能忽视NA,同时保存它们;至少在没有对data.frame进行重大操作的情况下是不能的。
希望这能有所帮助。
数据
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))https://stackoverflow.com/questions/36341397
复制相似问题