计算数据框中连续观察值之间的差异

问题描述 投票: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 difference
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[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.