gpt4 book ai didi

R:根据来自另一个数据框的匹配行更新列

转载 作者:行者123 更新时间:2023-12-04 01:34:01 27 4
gpt4 key购买 nike

我有

mydf1 <- data.frame(ID = c(1,2,3,4,5), color = c("red", NA, NA, NA, "green"), name = c("tom", "dick", "harry", "steve", "mike"))
mydf2 <- data.frame(ID = c(1,2,99), color = c("red", "orange", "yellow"), name = c("tom", "dick", "Aaron"))

我想用 mydf2 中对应的颜色更新 mydf1$color ,用于匹配 ID 和名称的任何行。所需的输出是将第 2 行中的颜色更新为橙色,其余部分保持原样:
   ID  color   name
1 1 red tom
2 2 orange dick
3 3 <NA> harry
4 4 <NA> steve
5 5 green mike

我在之前的一些帖子中尝试了非对称合并的解决方案,但在 mydf1.x 中我的一些字段被覆盖。然后我尝试按照另一篇文章中的建议使用 match,但收到错误消息。不知道为什么匹配条件不起作用。
mydf1$color <- mydf2$color[match(mydf1[c("ID", "name")], mydf2[c("ID", "name")])]

最佳答案

我们可以使用 data.table 的连接on 'ID' 和 'name' 列,并通过赋值( := )从第一个数据集中的第二个数据集中更新相应的 'color' 值

library(data.table)
setDT(mydf1)[mydf2, color := i.color, on = .(ID, name)]
mydf1
# ID color name
#1: 1 red tom
#2: 2 orange dick
#3: 3 <NA> harry
#4: 4 <NA> steve
#5: 5 green mike
match工作于 vector/matrix而不是在 data.frame .如果我们需要使用 match ,然后 paste每个数据集中的“ID”、“名称”并执行 match
i1 <- match(paste(mydf1$ID, mydf1$name), paste(mydf2$ID, mydf2$name), nomatch = 0)

或使用 tidyverse
library(dplyr)
mydf1 %>%
left_join(mydf2, by = c("ID", "name")) %>%
transmute(ID, name, color = coalesce(as.character(color.x),
as.character(color.y)))
# ID name color
#1 1 tom red
#2 2 dick orange
#3 3 harry <NA>
#4 4 steve <NA>
#5 5 mike green

关于R:根据来自另一个数据框的匹配行更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60234780/

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