1

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

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()循环来做,但我相信有更好的方法)!

4

1 回答 1

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。

于 2012-08-30T22:35:40.433 回答