在我最终达到-7之前r中数据帧之间的两两匹配 https://stackoverflow.com/questions/12123013/two-by-two-matching-between-dataframes-in-r是的,让我说我已经阅读了以下几页:
- 如何将行从一个 data.frame 复制到另一个 [R] https://stackoverflow.com/questions/10013985/how-to-copy-row-from-one-data-frame-in-to-another-r
- R 如何使用另一个 data.frame 中的值更新 data.frame 中的列 https://stackoverflow.com/questions/12427043/r-how-to-update-a-column-in-data-frame-using-values-from-another-data-frame
- 使用一个 data.frame 更新另一个 data.frame https://stackoverflow.com/questions/7971513/using-one-data-frame-to-update-another?rq=1
其实最后一张确实和我想要的很像,但又不一样,因为我的专栏不一样
我有两个数据框,比方说:
> d <- data.frame(year=c(2004,2004,2006),month = c(1,5,3), height = c(1000,2000,3000) )
> d
year month height
1 2004 1 1000
2 2004 5 2000
3 2006 3 3000
> e <- data.frame(year=c(2004),month=c(5), height = c(9999))
> e
year month height
1 2004 5 9999
显然真实的数据比这个长。
我想将 e 中的值合并到 d 中
尝试原始合并:
> merge(d,e)
[1] year month height
<0 rows> (or 0-length row.names)
好的。所以添加“by”:
> merge(d,e,by=c("year","month"))
year month height.x height.y
1 2004 5 2000 9999
好的,它进行了内部联接,并删除了 d 中的所有原始数据。所以尝试左外连接:
> merge(d,e,by=c("year","month"),all.x = T)
year month height.x height.y
1 2004 1 1000 NA
2 2004 5 2000 9999
3 2006 3 3000 NA
它执行了连接,并且根据外连接定义它是正确的,但它没有执行我想要的操作,即根据 e 中的值更新 d 中的值。我真正想要的更像是 sql 更新:
for (year,month,height) in e:
update d set d.height=e.height where d.year = e.year and d.month = e.month
即我想要的结果是:
> magic(d,e)
year month height
1 2004 1 1000
2 2004 5 9999
3 2006 3 3000
当然,我也可以写一堆for
循环,但我希望有一些矢量化的方法可以做到这一点?
编辑:我的示例只有一个关键列,但我真正的问题有两个。更新了示例以反映这一点。