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