R 将数据帧列表的列转换为因子
嗨,我手动给我的数据框贴标签,如下所示,我有800列要贴标签,然后我创建数据框的子集(数据的子设置有很多),然后将该数据框应用于函数进行计算 所有区块的标签都可能不同,而且为所有区块逐个创建标签也非常耗时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),
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} )