【问题标题】:Recoding multiple variables based on condition of one variable根据一个变量的条件重新编码多个变量
【发布时间】:2019-01-14 16:13:46
【问题描述】:

我想根据另一个变量中的值重新编码多个变量(其中大约 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


    【解决方案1】:

    我们可以使用data.table 中的set 来加快速度

    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
    

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

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

    【讨论】:

    • 我认为下面缺少一个括号。
    【解决方案2】:

    dplyr:

    library(dplyr)
    
    df %>%
      mutate_at(vars(var2:var90), funs(ifelse(var1 == 0, 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
    

    【讨论】:

    • 轰隆隆!这是一种享受。你能解释一下 funs() 中最后一个点的含义吗? (我检查了帮助文本,但我不明白)
    • 它指的是 vars 部分中的任何内容;在这种情况下,倒数第二个变量应该保持原样。
    【解决方案3】:

    我们也可以使用一些数学方法

    df[2:7] <- df[2:7] * +(df$var1 != 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
    

    对于等于 0 和不等于 0 的值,我们将 var1 分别转换为 0、1,然后将这些值与其余列相乘,使 0 值变为 0,而非 0 值保持不变。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      相关资源
      最近更新 更多