2012-08-30 65 views
1

更新:我道歉......我应该已经指定了有对于一些测试遗漏值(来进行ñ倍,其他机构所做的m次),和我想那将影响基于merge documentation答案:合并两个数据帧R:一个包含每个因素一行,其他包含每个因素多行

all.x逻辑;如果为TRUE,则额外的行将被添加到输出中,对于y中没有匹配行的x中的每一行都会添加一行。这些行将在那些通常用来自y的值填充的列中具有NAs。缺省值为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)) 

就像我的真实数据,这些ID数据帧每个因子水平一列,但测试数据有多个每次测试重复。我可以如何合并这些东西,以便我填写每个作品的作品?换句话说,我得到的数据帧应该是这样的:

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

+0

@ttmaccer我刚刚编辑了我的答案......我有可能影响答案的NAs。我知道默认合并删除了几乎所有的行(〜700到40),所以有些事情正在发生。 – Hendy

+0

@ttmaccer不完全理解'merge()'并且对R来说是新的,我完全不知道发生了什么,但我只需要使用merge(df.1,df.2,by =“common。 column.name“)'它工作。 – Hendy

回答

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和可以选择.y参数,以便在需要时获得左外连接或右外连接。如果由于某种原因,您想要维护df.testing中的项目顺序,您需要创建一个可以继续使用的列,然后再按order()编写。

+0

抱歉有可能造成混淆。我确实在某些列中缺少值(请参阅更新)。我尝试使用'by.x ='和'by.y'值,但不确定要选择哪个。我尝试了df.ids $ lot和df.testing $ lot(很好,在我的实际数据集中是相同的),并且在fix.by(by.x,x)中得到了错误:'by'必须指定唯一有效的列)' – Hendy

+0

对不起...合并仍然在测试数据上工作得很好,但绝对不是我的真实数据。我不知道发生了什么事。 – Hendy

+0

上次......我只需指定'by = common.column.name'。叹。那太简单了。 – Hendy

相关问题