在R中同时重新定义许多变量

时间:2015-07-06 17:11:25

标签: r

我想知道在R中是否有办法以干燥的方式考虑和重新排列许多变量。所以假设我有15个虚拟变量全部用0和1编码.R默认使0为参考类别我怎样才能使用factor和relevel函数将所有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")
}

2 个答案:

答案 0 :(得分:4)

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

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+"))

答案 1 :(得分:2)

我们可以使用set中的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))