计算数据帧中连续 obs 行之间的差异

问题描述 投票:0回答:1

我有这个假设的数据框

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
}
 

但是我没有得到我想要的结果

r dataframe
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.