循环通过变量名称的向量,同时降低因子水平

时间:2014-06-07 12:53:57

标签: r loops global-variables apply r-factor

我有一个字符向量,其中包含.GlobalEnv中结构相同变量的名称。我想从每个变量的相同因子中删除等级。

我如何,例如扩展下面的代码,实际更新全局环境中的变量?查看示例数据,意味着在zW之后删除Qsubset不存在的因子assign的级别.GlobalEnv

lapply(mget(var_list, .GlobalEnv), function(x) levels(x$z) <- droplevels(x$z))

我以为我可以做一些类似下面的例子来改变例如rownames使用lapply

list_of_dfs <- lapply(list_of_dfs, "rownames<-", NULL)

虚拟数据

z <- c("a",'a','b','a','c','d','b','d','d','b')
x <- c(10,2,33,41,5,64,17,11,22,1)
y <- c('W','W','W','W','W','Q','Q','Q','Q','Q')
df <- data.frame(cbind(z,x,y))

var_list <- c('W', 'Q')

# subsetting and assigning variables
for(i in var_list){
   assign(i, subset(df, y %in% i), envir=.GlobalEnv)
}

1 个答案:

答案 0 :(得分:2)

你在这一行做什么

lapply(mget(var_list, .GlobalEnv), function(x) levels(x$z) <- droplevels(x$z))

是您修改本地变量x,而不是Q中的变量W.GlobalEnv

您可以尝试以下内容:

lapply(var_list, function(x) assign(x, droplevels(get(x, envir=.GlobalEnv)), .GlobalEnv))

这会从所有列中删除未使用的级别,而不仅仅是z

要仅从z删除级别,您可以尝试:

lapply(var_list, function(x) 
       eval(parse(text=paste0(x, "['z'] <<- droplevels(", x,"['z'])"))))