r - 如何在未使用的因子水平上扩展data.frame?

时间:2015-10-28 08:15:41

标签: r dplyr tidyr

我需要为所有具有公共变量的数据帧列表执行此操作。我想扩展每个数据帧,以便将公共变量扩展到所有数据帧中的所有级别。

myList <- list(A = data.frame(A1 = rnorm(10), A2 = rnorm(10), A3 = rnorm(10),
                              year = factor(c(2000:2009))),
               B = data.frame(B1 = rnorm(10), B2 = rnorm(10), B3 = rnorm(10),
                              year = factor(c(2001:2010))))

masterYear <- unique(unlist(lapply(myList, function(x) levels(x$year)), use.names = F))

我到目前为止尝试在函数中使用dplyr和tidyr包

funExpand <- function(x){
         levels(x$year) <- c(levels(x$year), setdiff(masterYear, levels(x$year)))
         vars <- names(x)[-length(names(x))]
         x %>%
              tidyr::complete_(x, c(vars), fill = list(0))
         x
}

myList2 <- lapply(myList, funExpand)

但这会产生错误。我尝试了tidyr :: complete和tidyr :: complete_ functions(第一个参数x或年份?)的各种组合,都产生了一些错误。这告诉我,我没有正确地解释完整的功能。

除了修复此错误之外,我还欢迎所有改进流程的建议。

2 个答案:

答案 0 :(得分:1)

我猜你不需要x %>%

funExpand <- function(x) {levels(x$year) <- c(levels(x$year), 
                                  setdiff(masterYear, levels(x$year)))
                           vars <- names(x)[-length(names(x))]
                           complete_(x, vars, fill=list(0))}
lapply(myList, funExpand)

答案 1 :(得分:1)

更新以反映OP的评论

试试这个,

myList2 <- lapply(myList, 
                  function(db) {
                    db$year <- factor(as.character(db$year), levels=masterYear)
                    merge(db, data.frame(year=setdiff(masterYear, db$year)), all=T)
                  })

新行将有NA,如果您真的需要0在函数中添加另一行db[is.na(db)] <- 0