R 将数据帧列表的列转换为因子

R 将数据帧列表的列转换为因子,r,function,dplyr,R,Function,Dplyr,嗨,我手动给我的数据框贴标签,如下所示,我有800列要贴标签,然后我创建数据框的子集(数据的子设置有很多),然后将该数据框应用于函数进行计算 所有区块的标签都可能不同,而且为所有区块逐个创建标签也非常耗时 data<-data.frame( col1=c(1,1,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,1,1,1,NA,1,1,NA,NA,NA,NA,1,NA,NA,NA,NA,1,NA,1),

嗨,我手动给我的数据框贴标签,如下所示,我有800列要贴标签,然后我创建数据框的子集(数据的子设置有很多),然后将该数据框应用于函数进行计算

所有区块的标签都可能不同,而且为所有区块逐个创建标签也非常耗时

data<-data.frame( col1=c(1,1,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,1,1,1,NA,1,1,NA,NA,NA,NA,1,NA,NA,NA,NA,1,NA,1),
                  col2=c(1,1,1,1,1,NA,NA,NA,NA,1,1,1,1,1,NA,NA,NA,1,1,1,NA,1,1,1,1,1,NA,NA,NA,1,1,1,1,1,1,1,NA,NA,NA),
                  col3=c(1,1,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,1,1,1,NA,NA,NA,1,NA,NA,1,1,1,1,1,NA,NA,1),
                  col4=c(1,NA,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
                  col5=c(1,2,1,1,1,2,1,2,2,1,2,NA,1,1,2,2,2,1,1,1,2,NA,2,1,1,1,2,2,2,NA,1,2,2,1,1,1,2,2,2)
)  

data$col5<-factor(data$col5, levels=c(1,2), labels=c("Local","Overseas"))

df<- data
df$cc1<-1
df2<- subset(df, col5 == 'Local')
df$cc2<-ifelse(df$col5 == 'Local',1,NA)
lst<-list(df$cc1, df$cc2)
ldat<-list("ALL" = df, "Local" =df2)

col_names <- c("col1","col2"...."col4")
    labels <- c("Sales","Ops"...."HR")

make_mutator <- function(x) {
  paste0(
    "factor(", names(faclist)[[x]],
    ",labels=c('",
    paste0(faclist[[x]],
           collapse = "','"
    ), "'))"
  )
}


list_of_fac <- purrr::map_chr(seq_len(length(faclist)),
                              make_mutator)

names(list_of_fac) <- names(faclist)

ldat <- purrr::map(ldat,
                   ~mutate(.,
                           !!!parse_exprs(list_of_fac)))


data与
map
循环
列表后,使用
map2
而不是解析,这是一个更简单的选择。使用
map2
,我们根据命名的
列表
“faclist”传递感兴趣的列和要更改的标签

library(dplyr)
library(purrr)
ldat1 <- map(ldat, ~  {
     .x[names(faclist)] <- map2(.x %>% 
                             dplyr::select(names(faclist)), 
                         faclist, ~ factor(.x, labels= .y))
       .x} )

如果它不是一个
列表
,而是两个向量,那么只需将
名称(faclist)
更改为“col_names”向量,将
列表
更改为带有
标签的“faclist”
向量即可

ldat1 <- map(ldat, ~  {
     .x[col_names] <- map2(.x %>% 
                             dplyr::select(col_names), 
                         labels, ~ factor(.x, labels= .y))
       .x} )

ldat1实际上,我的更新中不再有facelist,我将只有col_名称,我刚刚更新了问题,现在您将获得更多understanding@sanuali0123更简单的是,只需将
名称(facelist)
替换为
col\u名称
,将
faclist
替换为
标签
funcion@sanuali0123更新了函数。我会请求将对象名更改为与函数名或参数名不同的名称我尝试过这样做,但输出是wierd col_names
ldat1 <- map(ldat, ~  {
     .x[col_names] <- map2(.x %>% 
                             dplyr::select(col_names), 
                         labels, ~ factor(.x, labels= .y))
       .x} )