我想通过以下列方式匹配id列来合并2个数据格式
dfmain =
id name val res
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e 和
dfsub =
id name val res
1 2 two true thanks
2 4 four false Sorry要获得
dfmain =
id name val res
1: 1 a
2: 2 two true thanks
3: 3 c
4: 4 four false Sorry
5: 5 e 请注意-
中的一个子集。
目前,我正在使用anti_join函数获取第一个dataframe中不匹配的行,并将第二个dataframe连接到这些行。
是否有更有效的方法来做到这一点?
尝试从setDT库中使用data.table,但每次只能更新一个列的值。
对不起,如果我错过了任何明显的解决方案,因为我是新的R,任何帮助将不胜感激
发布于 2021-03-28 18:40:58
我希望这是你的想法,否则请告诉我。我注意到,您只通过保留dfsub的列,将dfmain中的行替换为dfsub中相同id的行,因此,下面是我认为可以让您得到想要的内容的方法:
library(dplyr)
dfmain <- tribble(
~id, ~name, ~ val, ~ res,
1, "a", NA, NA,
2, "b", NA, NA,
3, "c", NA, NA,
4, "d", NA, NA,
5, "e" , NA, NA
)
dfsub <- tribble(
~id, ~name, ~val, ~res,
2, "two", TRUE, "thanks",
4 ,"four", FALSE, "Sorry"
)
dfmain %>%
filter(! id %in% dfsub$id) %>%
bind_rows(dfsub) %>%
arrange(id)
# A tibble: 5 x 4
id name val res
<dbl> <chr> <lgl> <chr>
1 1 a NA NA
2 2 two TRUE thanks
3 3 c NA NA
4 4 four FALSE Sorry
5 5 e NA NA 发布于 2021-03-28 19:36:43
你可以试试( @Anoushiravan R.感谢数据)
library(data.table)
library(dplyr)
setDT(dfsub)[setDT(dfmain),
on = "id"
][,
names(dfmain),
with = FALSE
][
,
Map(coalesce, .SD, dfmain)
]这给
id name val res
1: 1 a NA <NA>
2: 2 two TRUE thanks
3: 3 c NA <NA>
4: 4 four FALSE Sorry
5: 5 e NA <NA>https://stackoverflow.com/questions/66844659
复制相似问题