【问题标题】:Merge two lists of data.frames合并两个 data.frames 列表
【发布时间】:2017-04-20 14:36:14
【问题描述】:

我有两个 data.frames 列表,分别称为 df_epi_in_strataassign_zeros

> class(df_epi_in_strata)
[1] "list"
> class(df_epi_in_strata[[1]])
[1] "data.frame"

> df_epi_in_strata[[1]]
   Var1 Freq
1     1    2
2     2    1
3     3    1
4     6    3

> class(assign_zeros)
[1] "list"
> class(assign_zeros[[1]])
> [1] "data.frame"
> assign_zeros[[1]]
      x 0
1     4 0
2     5 0

我想合并 data.frames 以使每个列表对于数据框中的每个列表都是“完整的”。我需要匹配列表元素。也就是说,对于数据帧中的九个列表中的每一个,结果如下所示:

result_list[[1]]
  Var1 Freq
1  1   2
2  2   1
3  3   1
4  4   0
5  5   0
6  6   3

所以我将df_epi_in_strata[[1]]assign_zeros[[1]]df_epi_in_strata[[2]]assign_zeros[[2]] 合并,等等。

我的计划是连接每组两个 data.frame,然后按第 1 列排序。我知道我需要 assign_zeros 的名称来匹配 df_epi_in_strata 的名称才能连接列表。

我尝试了this,并设置了colnames <- c("Var1", "Freq1"),但得到了:

Error in list2env(lapply(assign_zeros, setNames, colnames), .GlobalEnv) : names(x) must be a character vector of the same length as x

有谁知道如何按索引合并数据帧,为我的九个列表中的每一个得到类似result_list 的结果?

【问题讨论】:

    标签: r


    【解决方案1】:

    目前还不清楚您实际上在做什么,但如果您将问题拆分为多个部分,那就相当容易了。

    第一步:创建一个合并一对 data.frames 的函数(这是使用 dplyr,因为没有理由不这样做):

    insert_missing_values = function (df, missing) {
        colnames(missing) = colnames(df)
        bind_rows(df, missing) %>% arrange(Var1)
    }
    

    接下来,应用于所有列表对:

    result_list = mapply(insert_missing_values, df_epi_in_strata, assign_zeros)
    

    【讨论】:

    • 谢谢,但我收到一个错误:Error in (function (df, missing) : could not find function "%>%"
    • @StatsSorceress 就像我说的,这需要 dplyr 包。
    【解决方案2】:

    这里是 purrr 解决方案与 setNames 在追加之前对齐列名:

    library(tidyverse)
    map2(df_epi_in_strata, assign_zeros, ~rbind(.x, setNames(.y, names(.x))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-26
      • 2017-08-08
      • 2014-01-06
      • 2011-12-26
      • 2019-03-02
      相关资源
      最近更新 更多