合并R中的两个数据帧:一个包含每个因子一行,另一个包含每个因子多个行

时间:2012-08-30 22:20:41

标签: r merge dataframe

更新:我道歉......我应该指定某些测试 缺少值(进行n次,其他进行m次),然后我我认为这会影响基于merge documentation的答案:

  

all.x逻辑;如果为TRUE,那么额外的行将被添加到输出中,一个用于x中的每一行,y中没有匹配的行。这些行将在那些通常用y值填充的列中具有NA。默认值为FALSE,因此只有包含x和y数据的行才会包含在输出中。

我不想要这些选项中的任何一个:即,我不希望只保留匹配的行/列值,也不希望用NA填充不匹配的行/列交集值。


我有来自实验的数据,并将我的化学成分存储在一个文件中并在另一个文件中进行测试。我想合并这些,所以我可以绘制由构图因子水平分面的箱形图,但我很难弄清楚如何做到这一点。这是一些示例数据(按上述方式调整):

set.seed(1)
df.ids <- data.frame(lot=c("A","B","C"),
                     var1=c(1,2,3),
                     var2=c(4,5,6))

df.testing <- data.frame(lot=c(rep("A",4), rep("B",4),rep("C",4)),
                         test1=rep(c(runif(3,min=1,max=5),NA),3),
                         test2=rep(c(runif(2,min=1,max=5),NA,NA),3),
                         test3=rep(runif(4,min=1,max=5),3))

与我的实际数据一样,ids数据框每个因子级别有一行,但每个测试复制的测试数据都有多个。我如何合并这些以便我为每个批次填写作文?换句话说,我的结果数据框看起来像这样:

| lot |    test1 | test2    |    test3 | var1 | var2 |
|-----+----------+----------+----------+------+------|
| A   | 2.062035 | 4.632831 | 4.593559 | 1    | 4    |
| A   | 2.488496 | 1.806728 | 4.778701 | 1    | 4    |
| A   | 3.291413 | NA       | 3.643191 | 1    | 4    |
| A   |       NA | NA       | 3.516456 | 1    | 4    |
| B   | 2.062035 | 4.632831 | 4.593559 | 2    | 5    |
| B   | 2.488496 | 1.806728 | 4.778701 | 2    | 5    |
| B   | 3.291413 | NA       | 3.643191 | 2    | 5    |
| B   |       NA | NA       | 3.516456 | 2    | 5    |
| C   | 2.062035 | 4.632831 | 4.593559 | 3    | 6    |
| C   | 2.488496 | 1.806728 | 4.778701 | 3    | 6    |
| C   | 3.291413 | NA       | 3.643191 | 3    | 6    |
| C   |       NA | NA       | 3.516456 | 3    | 6    |

最后,我想我所要做的就是匹配唯一的批次ID,然后只需将每个列的df.ids值复制到df.testing。我只是不知道(好吧,我想用for()循环来做这件事,但我确信有更好的方法)!

1 个答案:

答案 0 :(得分:2)

您可以重新排列列的顺序:

> merge(df.ids, df.testing)
  lot var1 var2    test1    test2
1   A    1    4 3.389578 11.55608
2   A    1    4 9.502077 15.47929
3   A    1    4 9.173870 17.18321
4   B    2    5 4.349115 12.85377
5   B    2    5 2.815137 14.45693
6   B    2    5 6.947180 17.45857
7   C    3    6 9.085507 17.92857
8   C    3    6 6.155680 12.58901
9   C    3    6 6.662026 19.92715

> merge(df.ids, df.testing)[c(1,4:5,2:3)]
  lot    test1    test2 var1 var2
1   A 3.389578 11.55608    1    4
2   A 9.502077 15.47929    1    4
3   A 9.173870 17.18321    1    4
4   B 4.349115 12.85377    2    5
5   B 2.815137 14.45693    2    5
6   B 6.947180 17.45857    2    5
7   C 9.085507 17.92857    3    6
8   C 6.155680 12.58901    3    6  
9   C 6.662026 19.92715    3    6

这原来是一个内连接,因为合并列中没有丢失的项目,但是可以选择by.x和by.y参数,这样你就得到了一个左外层或右外层如果需要加入。如果由于某种原因你想要维护df.testing中项目的顺序,你需要创建一个随附的列,然后是order()ed-by。