在我结束-7之前,像r中的数据帧之间的两个匹配,让我说我已经阅读了以下页面:
实际上,最后一个与我想要的非常相似,但不一样,因为我的专栏不同
我有两个数据帧,比方说:
> 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
Run Code Online (Sandbox Code Playgroud)
显然,真实数据比这长.
我想将e中的值合并到d中
尝试原始合并:
> merge(d,e)
[1] year month height
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)
好.所以添加"by":
> merge(d,e,by=c("year","month"))
year month height.x height.y
1 2004 5 2000 9999
Run Code Online (Sandbox Code Playgroud)
好吧,它做了一个内连接,并删除了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
Run Code Online (Sandbox Code Playgroud)
它做了一个连接,并且根据外连接定义它是正确的,但它没有做我想要的,即从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
Run Code Online (Sandbox Code Playgroud)
即我想要的结果是:
> magic(d,e)
year month height
1 2004 1 1000
2 2004 5 9999
3 2006 3 3000
Run Code Online (Sandbox Code Playgroud)
当然,我可以写一堆for循环,但我希望有一些矢量化的方法吗?
编辑:我的例子只有一个键列,但我真正的问题有两个.更新了示例以反映这一点.
您可以使用 data.table
library(data.table)
DD <- as.data.table(d)
DE <- as.data.table(e)
setkey(DD, year, month)
setkey(DE, year, month)
DD[DE, height := i.height]
Run Code Online (Sandbox Code Playgroud)
请注意,我有前缀高度,i.以确保它从i组件中读取高度值.
如果你阅读了data.table插图的介绍,你将很快理解rownames和data.table键之间的关系!