2010-02-28 89 views
4

我想合并两个data.frames在一起,基于它们的每个名称series_id共同的列名称。这里是我的MERGE语句:如何合并两个data.frame在R中,引用一个查找表

merge(test_growth_series_LUT, test_growth_series, by = intersect(series_id, series_id)) 

我得到的错误是

错误as.vector(Y):对象series_id'未找到

帮助给这个描述,但我看不出为什么它找不到series_id。示例数据如下。

### S3 method for class 'data.frame': 
    #merge(x, y, by = intersect(names(x), names(y)), 
    #  by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, 
    #  sort = TRUE, suffixes = c(".x",".y"), ...) 



# Create a long data.frame to store data... 
test_growth_series = data.frame ("read_day" = c(0, 3, 9, 0, 3, 9, 0, 2, 8), 
"series_id" = c("p1s1", "p1s1", "p1s1", "p1s2", "p1s2", "p1s2", "p3s4", "p3s4", "p3s4"), 
"mean_od" = c(0.6, 0.9, 1.3, 0.3, 0.6, 1.0, 0.2, 0.5, 1.2), 
"sd_od" = c(0.1, 0.2, 0.2, 0.1, 0.1, 0.3, 0.04, 0.1, 0.3), 
"n_in_stat" = c(8, 8, 8, 8, 7, 5, 8, 7, 2) 
) 

# Create a name LUT 
test_growth_series_LUT = data.frame ("series_id" = c("p1s1", "p1s2", "p3s4", "p4s2", "p5s2", "p6s2", "p7s4", "p8s4", "p9s4"),"description" = c("blah1", "blah2", "blah3", "blah4", "blah5", "blah6", "blah7", "blah8", "blah9") 
) 

> test_growth_series 
    read_day series_id mean_od sd_od n_in_stat 
1  0  p1s1  0.6 0.10   8 
2  3  p1s1  0.9 0.20   8 
3  9  p1s1  1.3 0.20   8 
4  0  p1s2  0.3 0.10   8 
5  3  p1s2  0.6 0.10   7 
6  9  p1s2  1.0 0.30   5 
7  0  p3s4  0.2 0.04   8 
8  2  p3s4  0.5 0.10   7 
9  8  p3s4  1.2 0.30   2 
> test_growth_series_LUT 
    series_id description 
1  p1s1  blah1 
2  p1s2  blah2 
3  p3s4  blah3 
4  p4s2  blah4 
5  p5s2  blah5 
6  p6s2  blah6 
7  p7s4  blah7 
8  p8s4  blah8 
9  p9s4  blah9 
> 



this is what I'm trying to achieve: 
> new_test_growth_series 
    read_day series_id mean_od sd_od n_in_stat  description 
1  0  p1s1  0.6 0.10   8  blah1 
2  3  p1s1  0.9 0.20   8  blah1 
3  9  p1s1  1.3 0.20   8  blah1 
4  0  p1s2  0.3 0.10   8  blah2 
5  3  p1s2  0.6 0.10   7  blah2 
6  9  p1s2  1.0 0.30   5  blah2 
7  0  p3s4  0.2 0.04   8  blah3 
8  2  p3s4  0.5 0.10   7  blah3 
9  8  p3s4  1.2 0.30   2  blah3 
+1

还讨论我觉得你只是读它,望文生义... “通过=相交(名称(X),姓名(Y))” 的意思,“你可以指定要加入的名称(例如,通过=“id”),但默认值是x的名称和y的名称的交集。 – 2010-03-01 05:40:24

回答

9

你可以只是这样做:

merge(test_growth_series_LUT, test_growth_series) 

它会自动匹配的姓名。如果你需要指定列,你做这样的:

merge(test_growth_series_LUT, test_growth_series, by = "series_id") 

或者,如果你需要指定两侧(仅如果他们有要匹配不同的名称需要)这样说:

merge(test_growth_series_LUT, test_growth_series, by.x = "series_id", by.y = "series_id") 

我建议看的例子(并通过他们走)通过转到帮助合并(?merge)或致电example("merge", "base")(用处不大,实际上通过它走自己

有两点需要注意:

  1. 您不需要在这里使用相交功能。使用c()可以明确指定多个列名称。或者使用all,all.xall.y参数来指定所需的连接类型。
  2. 在大多数情况下,除非已附加数据,否则您将使用引号来指定列名称。否则,它会抱怨无法找到名称。特别是,当您不使用引号时,该名称需要位于搜索路径中。
+0

广告注释2)在合并时必须用引号或列的逻辑/数字位置 – Marek 2010-03-01 02:37:37

0

我得到的错误是 “在错误as.vector(Y):对象series_id”未找到“

在data.frame A柱可以被称为喜欢这个:test_growth_series$series_id,它返回series_id的向量。在做相交是不必要的,但会被正确地这样写的:

intersect(test_growth_series$series_id, test_growth_series_LUT$series_id) 

要稍微更正确,你可能想要做一个左使用all.x=TRUE加入。如果test_growth_series中的series_id没有出现在您的查找表中,这将覆盖您。没有它,你可能会在结果中失去行。

merge(test_growth_series, test_growth_series_LUT, by = "series_id", all.x=TRUE) 

本主题中How to join data frames in R (inner, outer, left, right)?