R与前一列在多个列中的差异

时间:2019-02-17 21:06:55

标签: r dataframe

我有一个这样的数据帧,它是由变量的累加产生的:

id v1  v2   v3
1  4   5    9   
2  1   1    4

我想了解各列之间的差异,例如将数据帧转换为:

id v1  v2   v3
1  4   1    4   
2  1   0    3

如此有效地“去累加”得到的差值。这是原始df约有150列的一个小例子。

谢谢!

2 个答案:

答案 0 :(得分:0)

x <- read.table(header=TRUE, text="
id v1  v2   v3
1  4   5    9   
2  1   1    4")

x[,c("v1","v2","v3")] <- cbind(x[,"v1"], t(apply(x[,c("v1","v2","v3")], 1, diff)))
x
#   id v1 v2 v3
# 1  1  4  1  4
# 2  2  1  0  3

说明:

  • 在前面,请注意:在apply上使用data.frame时,它将参数转换为matrix。这意味着如果传递给character的参数中有apply列,则整个矩阵将为character,可能不是您想要的。因此,仅选择所需的列(并专门重新分配它们)会更安全。

  • apply(.., MARGIN=1, ...)以与预期相反的方向返回其输出,因此我必须将其包装在t(...)中。

  • 我正在使用diff,它返回一个长度比输入短一的向量,所以我正在cbind将原始列返回到t(apply(...))的返回值

  • 就像我必须确定要传递给apply的列一样,我同样也要确定将哪些列替换为返回值。

答案 1 :(得分:0)

简单的循环可能会解决问题,但是对于较大的数据,它将比其他方法慢。

df <- data.frame(id = c(1,2), v1 = c(4,1), v2 = c(5,1))
df2 <- df
for(i in 3:ncol(df)){
  df2[,i] <- df[,i] - df[,i-1]
}