【问题标题】:converting columns of list of data frame to factor将数据框列表的列转换为因子
【发布时间】:2020-10-09 05:27:13
【问题描述】:

嗨,我正在手动为我的数据框添加标签,如下所示,我有 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)))

这非常好,对我有用....但是如果我要为列和标签分别提供列和标签,我只想要新的解决方案

col_names

那我怎样才能改变我的功能......??

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    除了解析之外,更简单的选择是在使用map 循环list 之后使用map2。使用map2,我们根据命名list'faclist'传递感兴趣的列和要更改的标签

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

    -输出

    str(ldat1[[1]])
    #'data.frame':  39 obs. of  7 variables:
    # $ col1: Factor w/ 1 level "Sales": 1 1 NA NA NA NA NA NA 1 NA ...
    # $ col2: Factor w/ 1 level "OPS": 1 1 1 1 1 NA NA NA NA 1 ...
    # $ col3: Factor w/ 1 level "Management": 1 1 NA NA NA NA NA 1 NA NA ...
    # $ col4: Factor w/ 1 level "HR": 1 NA NA NA NA NA NA NA NA NA ...
    # $ col5: Factor w/ 2 levels "Local","Overseas": 1 2 1 1 1 2 1 2 2 1 ...
    # $ cc1 : num  1 1 1 1 1 1 1 1 1 1 ...
    # $ cc2 : num  1 NA 1 1 1 NA 1 NA NA 1 ...
    str(ldat1[[2]])
    #'data.frame':  18 obs. of  6 variables:
    # $ col1: Factor w/ 1 level "Sales": 1 NA NA NA NA NA NA NA 1 NA ...
    #$ col2: Factor w/ 1 level "OPS": 1 1 1 1 NA 1 1 1 1 1 ...
    # $ col3: Factor w/ 1 level "Management": 1 NA NA NA NA NA NA NA NA NA ...
    # $ col4: Factor w/ 1 level "HR": 1 NA NA NA NA NA NA NA NA 1 ...
    # $ col5: Factor w/ 2 levels "Local","Overseas": 1 1 1 1 1 1 1 1 1 1 ...
    # $ cc1 : num  1 1 1 1 1 1 1 1 1 1 ...
    

    如果不是list,而是两个向量,则只需将names(faclist) 更改为'col_names' 向量,将list 'faclist' 更改为labels 向量

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

    【讨论】:

    • 实际上我的更新中不再有 facelist ,我只有 col_names
    • 我刚刚更新了问题,现在你会得到更多的理解
    • @sanuali0123 更简单,只需将函数中的names(facelist) 替换为col_names 并将faclist 替换为labels 即可
    • @sanuali0123 更新了函数。我会要求将对象名称更改为与函数或参数名称不同的名称
    • 我试过了,但是输出很奇怪 col_names
    猜你喜欢
    • 2018-01-12
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2014-01-05
    相关资源
    最近更新 更多