首页 > 解决方案 > 将标签应用到数据框列表的自定义函数

问题描述

我有一个数据框列表,我正在尝试创建一个函数,我可以将其应用于我的数据框列表,为数据框的变量提供标签。

# Sample Data Frame
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),
                  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)
)  

data$region<-factor(data$region, levels=c(1,2), labels=c("ALL","Special"))

# list of data frames
df<- data
df$qq<-1
df2<- subset(df, region == 'ALL')
df$ss<-ifelse(df$region == 'ALL',1,NA)
lst<-list(df$qq, df$ss)
ldat<-list("ALL" = df, "other" =df2)


#function for giving labels to data frame
conv_frac <- function(dataset,colnames,collabels) {
  for( i in seq_along(ldat)){
    ldat2[[i]][] <- lapply(names(ldat[[i]]), function(x) factor(ldat[[i]][[x]], labels = collabels[[x]]))
  }
  
}


# applying function to my list of data frames
col_name <- c("Q1","Q2","Q3","Q4")
label <- c("asman","shakti","nakul","ram") 
ldat1 <- conv_frac(dataset = ldat,colnames = col_name,collabels = label)

但无法为此创建函数

标签: rdplyr

解决方案


将您的功能更改为:

conv_frac <- function(dataset,colnames,collabels) {
  lapply(dataset, function(p) {
    p[colnames] <- Map(function(x, y) factor(x, labels = y), 
                        p[colnames], collabels)
    p
  })
}

然后,您可以将其应用于数据框列表:

# applying function to my list of data frames
col_name <- c("Q1","Q2","Q3","Q4")
label <- c("asman","shakti","nakul","ram") 
ldat1 <- conv_frac(dataset = ldat,colnames = col_name,collabels = label)
ldat1

#$ALL
#      Q1     Q2    Q3   Q4  region qq ss
#1  asman shakti nakul  ram     ALL  1  1
#2  asman shakti nakul <NA> Special  1 NA
#3   <NA> shakti  <NA> <NA>     ALL  1  1
#4   <NA> shakti  <NA> <NA>     ALL  1  1
#...
#...

#$other
#      Q1     Q2    Q3   Q4 region qq
#1  asman shakti nakul  ram    ALL  1
#3   <NA> shakti  <NA> <NA>    ALL  1
#4   <NA> shakti  <NA> <NA>    ALL  1
#5   <NA> shakti  <NA> <NA>    ALL  1
#...
#...

推荐阅读