首页 > 解决方案 > 为不同的数据框列表动态标记

问题描述

我正在尝试创建一个自定义函数来为修改后的数据框列表提供标签。例如,我有一个如下所示的数据框。

data<-data.frame( Q1=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),
                  Q2=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),
                  Q3=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),
                  Q4=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),
                  Q5=c(NA,1,NA,NA,1,NA,1,1,NA,NA,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,NA,1,NA,1,NA,1,NA,1,NA),
                  Q6=c(1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,1,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,1,1,1,1,1,1,NA,1,NA,1,1,NA,1),
                  Q7=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  Q8=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  region=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)
)  

标签: rfunctiondplyr

解决方案


conv_fac <- function(
  dataset, # list containing input dataframes
  labels   # list of vectors; in each vector, first label is destination column and all the rest are sources
  ){
  for (i in seq_len(length(dataset))){
    this_df <- dataset[[i]]
    for (this_label in labels){
      col_target <- this_label[1]
      cols_source <- this_label[-1]
      vecs <- this_df[,cols_source]
      cat('\nProcessing dataframe #',i,': column ',col_target, ' from columns ', paste0(cols_source, collapse = ', '),  sep = '')      
      this_df[[col_target]] <- coalesce(!!!vecs) 
    }
    this_df -> dataset[[i]]
  }
  return(dataset)
}

# Usage:

ldat <- list("ALL" = df, "other" =df2) 
var1 <- c("Q9","Q8","Q4")
var2 <- c("Q7","Q6","Q5")

ldat2 <- conv_fac(dataset = ldat, labels = list(var1,var2))

推荐阅读