大R数据帧-如何有效计算列

时间:2018-11-30 16:07:31

标签: r

我在R中有一个数据框,该数据框具有名为X.new,X.old,X.delta; Y.new,Y.old,Y.detal等的数字列。我有100多个具有相似命名的列。我希望将相似名称的delta列计算为新的减去旧的。例如,对于数据帧的每一行,X.delta应计算为X.new-X.old。我大约有一百万行。目前,我有一个循环可以执行此操作,但我知道这不是最有效的方法。我可以更有效地使用purr或任何其他软件包来执行此操作吗?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是完成您所请求内容的一种非常通用的方法:

首先是一些伪数据:

df <- data.frame(
  x.old = runif(1000),
  x.new = runif(1000),
  y.old = runif(1000),
  y.new = runif(1000)
)

通过在每个.之前的单词前添加单词来提取前缀

pfx <- unique(gsub("(^..*)\\...*$", "\\1", names(df)))
pfx <- setNames(pfx, paste0(pfx, ".delta"))

遍历每个前缀,并使用它们为原始data.frame列建立索引并计算增量。这些循环在R中很好用。

deltas <- lapply(pfx, function(col) {
  old <- paste0(col, ".old")
  new <- paste0(col, ".new")
  df[[new]] - df[[old]]
})

将增量添加到原始数据集中:

res <- cbind(df, deltas)

> head(res)
       x.old      x.new      y.old     y.new    x.delta    y.delta
1 0.16582237 0.65722478 0.69491911 0.0321141  0.4914024 -0.6628050
2 0.31899968 0.86988894 0.63381341 0.3421112  0.5508893 -0.2917022
3 0.27247366 0.52519659 0.08306147 0.9015832  0.2527229  0.8185217
4 0.04901993 0.26079681 0.79428604 0.9277292  0.2117769  0.1334432
5 0.14126815 0.03030174 0.54559952 0.9441938 -0.1109664  0.3985943
6 0.21614648 0.03249826 0.90492169 0.1399136 -0.1836482 -0.7650081
相关问题