gpt4 book ai didi

r - R中的部分合并

转载 作者:行者123 更新时间:2023-12-04 23:05:42 25 4
gpt4 key购买 nike

在我以 -7 结束之前,如 Two by two matching between dataframes in r确实,让我说我已经阅读了以下页面:

  • How to copy row from one data.frame in to another [R]
  • R How to update a column in data.frame using values from another data.frame
  • Using one data.frame to update another

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

    我有两个数据框,让我们说:
    > 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)

    好的。所以添加“通过”:
    > 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循环,但我希望有一些矢量化的方式来做到这一点?

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

    最佳答案

    您可以使用 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]

    请注意,我在高度前面加上了 i.确保它从 i 读取高度值成分。

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

    关于r - R中的部分合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13007078/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com