【问题标题】:Update data frame in R with another one用另一个更新 R 中的数据框
【发布时间】:2017-11-13 11:35:16
【问题描述】:

我有两个数据框。 Df1 是主要的,Df2 是更新的。我试图从 df2 到 df1 获得价值,但我所做的任何事情对我来说似乎都不起作用。匹配/合并给出了 NA,并且所有类型的连接命令也不起作用。

V1 <- c("AB1002017103", "AB1002017103", "AB1002017103"
,"AB1002017104"
,"AB1002017105"
,"AB1002017106"
,"AB1002017107"
,"AB1002017108"
,"AB1002017109"
,"AB1002017111")
V2 <- c(249,242,253,211,264,237,291,286,232,0)
df1 <- data.frame(V1,V2)
df1$V1 <- as.character(as.factor(df1$V1))

V1 <- c("AB1002017111"); V2 <- 165
df2 <- data.frame(V1,V2)
df2$V1 <- as.character(as.factor(df2$V1))

输出应该全部来自 df1,最后一个值为 165。请问有什么想法吗?我使用的匹配示例:

df1$V2 <- df2$V2[match(df1$V1,df2$V1)]

【问题讨论】:

  • 默认情况下,如果没有匹配,match 返回 NA,使用 nomatch = 0 并在 lhs 上执行相同的索引,即 df1$V2[match(df2$V1,df1$V1)] &lt;- df2$V2[match(df1$V1,df2$V1, nomatch = 0)]
  • 谢谢。它在我的简单示例中就像魔术一样工作,但是当我用于整个数据集时,它会给出错误“下标分配中不允许使用 NA”。知道为什么吗?检查 str 和比较值,似乎与 V1 相同。
  • 正如我提到的,您需要nomatch=0。长度是否相同,即两个match。请检查每场比赛的输出。
  • 我已将 nomatch 设置为 0,但仍然没有运气。在我原来的例子中,长度也不同,不是吗?在这里,我有 597 行的 df1 和 2308 行的 df2,但是 197 行的 V1 长度相同。 Df1 的 V2 为 0,而 df2 的 V2 正确,我想复制到 df1。我需要像excel中的vlookup这样的东西。附言如何检查每场比赛的输出?
  • 我的意思是输入match(df2$V1,df1$V1)match(df1$V1,df2$V1, nomatch = 0) 检查第一种情况是否有NA,非零元素的长度是否相同

标签: r


【解决方案1】:

根据 akrun 的帮助(非常感谢),发现下面的代码可以正常工作。

df1$V2[match(df2$V1,df1$V1, nomatch=0)] &lt;- df2$V2[match(df1$V1,df2$V1, nomatch = 0)]

再次感谢阿克伦!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多