我有这个假设的数据框
df<- data.frame(a_13=c(NA, 1, 2),
a_12=c(NA, 4, 3),
a_11=c(NA, 2,NA))
df
a_13 a_12 a_11
1 NA NA NA
2 1 4 2
3 2 3 NA
我想计算上述数据框中连续的obs rowwise之间的差异,即 我想用 3 个附加列(I_13、I_12、I_11)来扩充上述数据框,其中每个列 这些新列的行将由相应的元素的连续差异产生 行列 (a_13, a_12, a_11),即 (a_13-a_12, a_12-a_11, a_11)
所以我的新数据框应该是
df_D <- data.frame(a_13=c(NA, 1, 2),
a_12=c(NA, 4, 3),
a_11=c(NA, 2,NA),
I_13=c(NA-NA,1-4, 2-3),
I_12=c(NA-NA, 4-2,3-NA),
I_11=c(NA,2,NA))
df_D
a_13 a_12 a_11 I_13 I_12 I_11
1 NA NA NA NA NA NA
2 1 4 2 -3 2 2
3 2 3 NA -1 NA NA
最后一列 I_11 本质上是 a_11。
我的真实数据框包含数十万行和 a_13 到 a_1。因此,更通用的代码会有所帮助。
我尝试过类似的事情
NN<-names(df)
for (j in NN){
df$N<-df[,which(NN==j)] - df[,which(NN==j)+1]
re<-paste("I", j, sep="_")
names(df)[ncol(df)]<-re
}
但是我没有得到我想要的结果
您可以使用
diff()
。请注意,如果 diff
应用于矩阵,则对每一列分别进行差分运算。因此,我们需要转置 diff()
之前的数据,然后转置回来。
t(-diff(t(cbind(df, 0))))
# a_12 a_11 0
# [1,] NA NA NA
# [2,] -3 2 2
# [3,] -1 NA NA
与
df
结合:
df[sub("^a", "I", names(df))] <- t(-diff(t(cbind(df, 0))))
df
# a_13 a_12 a_11 I_13 I_12 I_11
# 1 NA NA NA NA NA NA
# 2 1 4 2 -3 2 2
# 3 2 3 NA -1 NA NA