首页 > 解决方案 > 根据R中行的其余部分替换变量的值

问题描述

我有一个变量,其值取同一行中其他变量的最大值。我使用了一个 for 循环,它可以完成这项工作,但是有 220,000 次观察,它的效率相当低。

for (i in 1:nrow(df)) {
  x <- c(df$var1[i], df$var2[i], df$var3[i], df$var4[i])
  df$var5[i] <- max(x)
}

比遍历每一行更顺畅的解决方法有什么想法吗?

标签: rfor-loop

解决方案


这是一个 data.table 方法

DT[, var1234_min := do.call(pmax,.SD), .SDcols = patterns("var[1-4]")]

样本数据

library(data.table)
set.seed(123)
n = 10
DT <- data.table( id = 1:10, 
                  var1 = rnorm(n),
                  var2 = rnorm(n),
                  var3 = rnorm(n),
                  var4 = rnorm(n),
                  var5 = rnorm(n))
#    id        var1       var2       var3        var4        var5
# 1:  1 -0.56047565  1.2240818 -1.0678237  0.42646422 -0.69470698
# 2:  2 -0.23017749  0.3598138 -0.2179749 -0.29507148 -0.20791728
# 3:  3  1.55870831  0.4007715 -1.0260044  0.89512566 -1.26539635
# 4:  4  0.07050839  0.1106827 -0.7288912  0.87813349  2.16895597
# 5:  5  0.12928774 -0.5558411 -0.6250393  0.82158108  1.20796200
# 6:  6  1.71506499  1.7869131 -1.6866933  0.68864025 -1.12310858
# 7:  7  0.46091621  0.4978505  0.8377870  0.55391765 -0.40288484
# 8:  8 -1.26506123 -1.9666172  0.1533731 -0.06191171 -0.46665535
# 9:  9 -0.68685285  0.7013559 -1.1381369 -0.30596266  0.77996512
#10: 10 -0.44566197 -0.4727914  1.2538149 -0.38047100 -0.08336907

推荐阅读