首页 > 解决方案 > 根据一个变量的条件重新编码多个变量

问题描述

我想根据另一个变量中的值重新编码多个变量(其中大约 90 个)。

这是一个示例:

df <- data.frame(var1 = c(1,0,5,10,0), var2 = c(1:5), var3 = c(1:5), var4 = 
c(1:5), var5 = c(1:5), var6 = c(1:5), var90 = c(1:5))

df

  var1 var2 var3 var4 var5 var6 var90
1    1    1    1    1    1    1     1
2    0    2    2    2    2    2     2
3    5    3    3    3    3    3     3
4   10    4    4    4    4    4     4
5    0    5    5    5    5    5     5

当 var1 = 0 时,我想将 var2 重新编码为 var90 为 0,否则保持原样。

我可以使用以下方法轻松地重新编码单个变量:

df[df$var1 == 0, c("var2")] <- 0

我可以使用数字符号将其应用于多列:

df[df$var1 == 0, c(2:7)] <- 0

在这个小样本集上做得很好,这是预期的结果:

  var1 var2 var3 var4 var5 var6 var90
1    1    1    1    1    1    1     1
2    0    0    0    0    0    0     0
3    5    3    3    3    3    3     3
4   10    4    4    4    4    4     4
5    0    0    0    0    0    0     0

然而,在我的完整数据集(约 90 个变量,90,000 行)上,我不得不在大约 20 分钟后中止,因为它仍然没有运行(希望让它在几秒钟内而不是几分钟内运行)。

关于如何有效地解决这个问题的任何想法?

标签: r

解决方案


我们可以使用setfromdata.table来加快速度

library(data.table)
setDT(df)
for(j in 2:7) set(df, i = which(df$var1 == 0), j = j, value = 0)
df
#   var1 var2 var3 var4 var5 var6 var90
#1:    1    1    1    1    1    1     1
#2:    0    0    0    0    0    0     0
#3:    5    3    3    3    3    3     3
#4:   10    4    4    4    4    4     4
#5:    0    0    0    0    0    0     0

另外,我们可以使用lapplyfrombase R来避免创建一个大的逻辑矩阵

df[2:7] <- lapply(df[2:7], function(x) replace(x, df$var1 == 0, 0))

推荐阅读