如何将数据框架与唯一行和不同的列/列顺序合并?

时间:2018-01-14 21:50:07

标签: r merge dplyr

问:如何将数据框与唯一行和不同数量的共享列合并?

背景

我有大量不同的调查受访者数据集 我想要组合成一个数据帧(或者tibble,如果 我们正在使用dplyr)。每个受访者都是独一无二的没有受访者 出现在多个数据集中。

如果每个数据集都包含每个变量,那么这将是一项简单的任务 相同的列顺序,因为解决方案是:

combined <- rbind(df1, df2, df3, dfn)

可悲的是,这不是这些数据的状态。相反,每个数据集 有一个变量的受访者ID号,调查年份,国家 调查,以及不出现的不同数量的问题 在原始数据集中以相同的列顺序。他们确实有 但是,相同的变量名称

再次提出这个问题,考虑到背景

如何将这些数据集合并到一个数据框中 a)每个受访者行都是唯一的,b)并非所有变量都出现在 所有数据集,以及c)并非所有变量都出现在同一列中 订单?

一些示例数据

只有两个数据帧(实际上是三元组)的简单开始是:

df1 <-
    tribble(~ rid,  ~ a,  ~ b,  ~ c,
                1, "a1", "b1", "c1",
                2, "a2", "b2", "c2",
                3, "a3", "b3", "c3")

df2 <-
    tribble(~ rid,  ~ a,  ~ d,  ~ c,  ~ e,
                4, "a4", "d1", "c4", "e1",
                5, "a5", "d2", "c5", "e2",
                6, "a6", "d3", "c6", "e3")

受访者由rid标识。每个问题都已确定 通过其他变量之一。在此示例中,问题a和 两次调查均询问c,但b仅在此调查中被询问 第一次调查,de仅在第二次调查中被询问 调查。

目标是让受访者拥有行和变量 当没有出现变量时填充NA s的列是a 数据集。

我尝试了什么

我对基础R的merge操作有点粗鲁 dplyr *_joinfull_join(df1, df2, by = "rid")次操作。我甚至不确定这是不是 正确的方法来解决这个问题,或者“合并”是什么 甚至是正确的动词。因此,也许是天真的,我试过了 # A tibble: 6 x 8 rid a.x b c.x a.y d c.y e <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 1 a1 b1 c1 <NA> <NA> <NA> <NA> 2 2 a2 b2 c2 <NA> <NA> <NA> <NA> 3 3 a3 b3 c3 <NA> <NA> <NA> <NA> 4 4 <NA> <NA> <NA> a4 d1 c4 e1 5 5 <NA> <NA> <NA> a5 d2 c5 e2 6 6 <NA> <NA> <NA> a6 d3 c6 e3 ,产生:

    rid     a     b     c     d     e
  <dbl> <chr> <chr> <chr> <chr> <chr>
1     1    a1    b1    c1  <NA>  <NA>
2     2    a2    b2    c2  <NA>  <NA>
3     3    a3    b3    c3  <NA>  <NA>
4     4    a4  <NA>    c4    d1    e1
5     5    a5  <NA>    c5    d2    e2
6     6    a6  <NA>    c6    d3    e3

相反,我想要的是:

list(df1, df2) %>%
    Reduce(function(dtf1, dtf2) full_join(dtf1, dtf2, by="rid"), .)

另一种无效的解决方案

我尝试了Simultaneously merge multiple data.frames in a list中的解决方案,但它给了我不可思议的结果:

# A tibble: 6 x 8
    rid   a.x     b   c.x   a.y     d   c.y     e
  <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1     1    a1    b1    c1  <NA>  <NA>  <NA>  <NA>
2     2    a2    b2    c2  <NA>  <NA>  <NA>  <NA>
3     3    a3    b3    c3  <NA>  <NA>  <NA>  <NA>
4     4  <NA>  <NA>  <NA>    a4    d1    c4    e1
5     5  <NA>  <NA>  <NA>    a5    d2    c5    e2
6     6  <NA>  <NA>  <NA>    a6    d3    c6    e3

哪个收益率:

a

我不知道为什么cCheckBox没有正确合并。

0 个答案:

没有答案