【问题标题】:R Difference with previous column across multiple columnsR与多列上一列的差异
【发布时间】:2019-02-18 05:15:19
【问题描述】:

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

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 列。

谢谢!

【问题讨论】:

  • 如果数据帧大小相同,您可以减去它们。所以你可以使用df[3:4] - df[2:3] 完成大部分工作——只需更改索引以适应
  • EGM8686,如果其中一个答案解决了您的问题,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)

标签: r dataframe


【解决方案1】:
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

解释:

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

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

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

  • 正如我必须具体说明要传递给 apply 的列一样,我同样具体说明哪些列将被返回值替换。

【讨论】:

    【解决方案2】:

    简单的循环可能会奏效,但对于较大的数据,它会比其他方法慢。

    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]
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多