【问题标题】:r - How to expand data.frame over unused factor levels?r - 如何在未使用的因子水平上扩展 data.frame?
【发布时间】:2015-10-28 08:15:41
【问题描述】:

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

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_ 函数的各种组合(第一个参数 x 或 year?),都产生了一些错误。这告诉我我没有正确解释完整的功能。

除了修复这个错误,我也欢迎所有改进过程的建议。

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案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)] &lt;- 0

    【讨论】:

    • 谢谢。我需要所有 dfs 中的年份列在所有 dfs 中找到的所有年份的联合,当该特定 df 中不存在时,其值为零。不幸的是,你的建议没有做到。
    • @Antti 我已根据您的评论更新了答案
    【解决方案2】:

    我猜你不需要x %&gt;%

    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)
    

    【讨论】:

    • 这可能是真的。我从通过谷歌搜索找到的一些示例开始,该示例通过管道传输 tidyr::expand 和 dplyr::left_join - 两者都完成。但是,我无法按照您的建议进行操作。
    • @Antti 我的解决方案基于您使用的代码和您显示的错误。
    • 我很感激!然而,它并没有解决问题。
    • @Antti 正如我所说,我只是在纠正错误。根据您之前的评论,您已经获得了其他函数名称。代码是关于complete的时候我当然不会去想其他功能
    • 很公平。在这种情况下,评论而不是完整的答案是合适的。恕我直言。
    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多