【问题标题】:Custom function for converting factor of list of data frames数据框列表转换因子的自定义函数
【发布时间】:2020-10-10 10:00:24
【问题描述】:

我正在尝试根据我之前的问题创建一个函数 converting columns of list of data frame to factor

但是在尝试创建一个函数时,我得到了错误,没有得到想要的输出

# Sample Data Frame

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

# creating a list of dataframes
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)

###############

# Created function in separate file and sourcing it in my rmd file
#"sub_function"

fac_conv <- function(x) {
  paste0(
    "factor(", col_names[[x]],
    ",labels=c('",
    paste0(labels[[x]],
           collapse = "','"
    ), "'))"
  )
}


fac_conv_lapply <- function(data,col_names,labels) {
  list_of_fac <- purrr::map_chr(seq_len(length(col_names)),
                                fac_conv)
  ldat <- map(data, ~  {
    .x[col_names] <- map2(.x %>% 
                            dplyr::select(col_names), 
                          labels, ~ factor(.x, labels= .y))
    .x} )
  
}

# NOw I am applying my function like below in my rmd file

col_name <- c("col1","col2","col3","col4")
label <- c("Sales","Ops","admin","HR") 

fac_conv_lapply(data = ldat,col_names = col_name, labels = label )

错误: paste0("factor(", col_names[[x]], ",labels=c('", paste0(labels[[x]], ) 中的错误: 找不到对象“col_names”

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    为了让您的代码正常工作,将fac_conv 移动到fac_conv_lapply

    # Sample Data Frame
    library(purrr)
    library(dplyr)
    
    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)
    
    fac_conv_lapply <- function(data,col_names,labels) {
      
      fac_conv <- function(x) {
        paste0(
          "factor(", col_names[[x]],
          ",labels=c('",
          paste0(labels[[x]],
                 collapse = "','"
          ), "'))"
        )
      }
      
      list_of_fac <- purrr::map_chr(seq_len(length(col_names)),
                                    fac_conv)
      ldat <- map(data, ~  {
        .x[col_names] <- map2(.x %>% 
                                dplyr::select(col_names), 
                              labels, ~ factor(.x, labels= .y))
        .x} )
    
      ldat
    }
    
    col_name <- c("col1","col2","col3","col4")
    label <- c("Sales","Ops","admin","HR") 
    
    ldat1 <- fac_conv_lapply(data = ldat, col_names = col_name, labels = label )
    
    lapply(ldat1, head)
    #> $ALL
    #>    col1 col2  col3 col4     col5 cc1 cc2
    #> 1 Sales  Ops admin   HR    Local   1   1
    #> 2 Sales  Ops admin <NA> Overseas   1  NA
    #> 3  <NA>  Ops  <NA> <NA>    Local   1   1
    #> 4  <NA>  Ops  <NA> <NA>    Local   1   1
    #> 5  <NA>  Ops  <NA> <NA>    Local   1   1
    #> 6  <NA> <NA>  <NA> <NA> Overseas   1  NA
    #> 
    #> $Local
    #>     col1 col2  col3 col4  col5 cc1
    #> 1  Sales  Ops admin   HR Local   1
    #> 3   <NA>  Ops  <NA> <NA> Local   1
    #> 4   <NA>  Ops  <NA> <NA> Local   1
    #> 5   <NA>  Ops  <NA> <NA> Local   1
    #> 7   <NA> <NA>  <NA> <NA> Local   1
    #> 10  <NA>  Ops  <NA> <NA> Local   1
    

    reprex package (v0.3.0) 于 2020 年 10 月 10 日创建

    但是,我首选的解决方案是将fac_conv 重写为两个参数函数

    fac_conv <- function(x, y) {
      paste0(
        "factor(", x,
        ",labels=c('",
        paste0(y,
          collapse = "','"
        ), "'))"
      )
    

    然后这样称呼它:

    list_of_fac <- purrr::map2_chr(col_names, labels, fac_conv)
    

    编辑不知道你的意思'

    【讨论】:

    • 它对我不起作用,实际上输入参数应该是(data = ldat,col_names = col_name,labels = label)输入数据将始终是函数的 ldat
    • 所以要求该函数不能直接用于数据,而是用于 ldat(数据帧列表)。我无法为 ldat 创建它。
    • 嗨@sanuali0123。在将函数应用于您的 dfs 列表时,我刚刚进行了编辑并编辑了包括输出在内的完整代码。
    • 还有一件事,我还有另一种方法,但无法用它创建函数,问题是一样的,但这是简单的方法。你能帮我创建一个函数吗 for( i in seq_along(ldat)){ ldat2[[i]][]
    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多