【问题标题】:relevel many variables at once in R在R中一次重新调整许多变量
【发布时间】:2015-09-23 22:45:48
【问题描述】:

我想知道 R 中是否有办法以 DRY 方式分解和重新调整许多变量。所以假设我有 15 个虚拟变量,全部用 0 和 1 编码。默认情况下,R 将 0 设为参考类别我如何使用因子和重新调整函数将所有 15 个变量的参考水平更改为 1。这可以在循环中完成吗?比如:

varList <- list("V1", "V2", "V3", "V4", "V5", "V6", "V7", 
                 "V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15")

for (i in varList) {
    df$i <- factor(df$i)
    df$i <- relevel(df$i, ref = "1")
}

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用[[ 以这种方式访问​​变量:

    for (i in varList) {
        df[[i]] <- relevel(factor(df[[i]]), ref = "1")
    }
    

    将相同的转换应用于数据框的许多列的另一种方法是使用 dplyr 的 mutate_each 函数:

    library(dplyr)
    var_vector <- c("V1", "V2", "V3", "V4", "V5", "V6", "V7", 
                    "V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15")
    
    relev <- function(f) relevel(factor(f), ref = "1")
    
    df <- mutate_each(df, funs(relev), one_of(var_vector))
    

    如果您要转换的列都遵循特定模式,您可以简单地执行以下操作:

    # transform columns that start with V
    df <- mutate_each(df, funs(relev), starts_with("V"))
    # transform columns that have V then a number
    df <- mutate_each(df, funs(relev), matches("^V\\d+"))
    

    【讨论】:

    • 啊太棒了!感谢您的帮助!
    【解决方案2】:

    我们可以使用 set from data.table 在循环中更改多个列。由于避免了[.data.table 的开销,因此非常有效。

    library(data.table)#v1.9.5
    setDT(df)
    nm1 <- unlist(varList)
    
    for(j in nm1){
       set(df, i=NULL, j=j, value=relevel(factor(df[[j]]), ref="1"))
    }  
    
    str(df)
    

    数据

    set.seed(12)
    df <- as.data.frame(matrix(as.character(sample(0:9, 20*100, 
            replace=TRUE)), ncol=20))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2018-07-18
      • 2018-10-26
      • 2023-04-04
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多