【问题标题】:Data.frame merge usage for selective row replacement [duplicate]用于选择性行替换的 Data.frame 合并用法[重复]
【发布时间】:2012-11-29 06:19:50
【问题描述】:

可能重复:
how to use merge() to update a table in R

对于 R 中的这种操作,合并的正确用途是什么?见下文。

older <- data.frame(Member=c("first","second","third","fourth"),
                       VAL=c(NA,NA,NA,NA))
newer <- data.frame(Member=c("third","first"),
                       VAL=c(2125,4587))

# 
merge.data.frame(older,newer,all=T)
  Member  VAL
  1  first 4587
  2  first   NA
  3 fourth   NA
  4 second   NA
  5  third 2125
  6  third   NA

上面的内容并不完全符合我的预期,我想用新条目替换旧条目,而不是添加另一行。如下所示。我在 merge.data.frame 上失败了。

my.merge.fu(older,newer)
  Member  VAL
  1  first 4587
  2 second   NA
  3  third 2125
  4 fourth   NA

一种选择性行替换,其中较新的成员优先,并且不能包含除较旧成员之外的其他成员。

这种 R 操作是否有适当的英文术语,是否有预建函数?

谢谢。

【问题讨论】:

  • 如果您使用by='Member'all=TRUE,您将获得一个具有您正在寻找的结构的新列。但我很想知道您是否可以使用 merge 并仅返回该列。
  • 以前在SO 上发布过两个可能的解决方案,也有类似的问题
  • @Petr newer 可以包含 fifth 条目吗?
  • @Matthew 感谢您的提问,除了较旧的成员之外,没有新成员不能包含其他成员。我进行了编辑以添加这个重要的细节。
  • @Justin 看起来你的提示对我来说效果很好,至少小的包装函数可以完成这项工作。非常感谢您的建议。

标签: r


【解决方案1】:

你已经有效地回答了你自己的问题。

如果你想处理 Matthew Ploude 的观点,你可以使用

older$VAL[match(newer[newer$Member %in% older$Member, ]$Member, older$Member)
          ]  <- newer[newer$Member %in% older$Member, ]$VAL

这也是newer 有多个新值的效果,它是最新的,以older 结尾,例如

older <- data.frame(Member=c("first","second","third","fourth"),
                       VAL=c(1234,NA,NA,5678))
newer <- data.frame(Member=c("third","first","fifth","first"),
                       VAL=c(2125,4587,2233,9876))

older$VAL[match(newer[newer$Member %in% older$Member,]$Member, older$Member)
          ]  <- newer[newer$Member %in% older$Member,]$VAL

给予

> older
  Member  VAL
1  first 9876
2 second   NA
3  third 2125
4 fourth 5678

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多