4

在我像r 中的数据帧之间的二乘二匹配那样以 -7 结束之前,让我说我已经阅读了以下页面:

其实最后一个真的和我想要的很像,但是不一样,因为我的栏目不一样

我有两个数据框,比如说:

> 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循环,但我希望有一些矢量化的方式来做到这一点?

编辑:我的示例只有一个键列,但我真正的问题有两个。更新了示例以反映这一点。

4

2 回答 2

7

您可以使用data.table

编辑注意 e 和 d 都有一个由月份和年份定义的键

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]

请注意,我在 height 前面加上了前缀,i.以确保它正在从i组件中读取高度值。

如果您阅读 data.table 小插图的介绍,您将很快了解 rownames 和 data.table 键之间的关系!

于 2012-10-22T08:00:37.293 回答
2

实际上,以下方法更直接:

rownames( d ) <- d$id
d[ e$id, ]$height <- e$height

更新:由于您的密钥实际上是“年月”,您可能最好使用数据表,但如果您不愿意使用它,您可以执行以下操作:

rownames( d ) <- paste( d$year, d$month )
d[ paste( e$year, e$month ), ]$height <- e$height
于 2012-10-22T07:58:32.300 回答