如何连接或合并不同大小的数据帧,同时覆盖R中缺失的值?
R问题 我希望连接多个大小不等的数据帧。在加入数据帧时,我希望覆盖任何NAs。我尝试使用coalesce函数,但需要大小相同的数据帧 范例如何连接或合并不同大小的数据帧,同时覆盖R中缺失的值?,r,dplyr,merge,coalesce,natural-join,R,Dplyr,Merge,Coalesce,Natural Join,R问题 我希望连接多个大小不等的数据帧。在加入数据帧时,我希望覆盖任何NAs。我尝试使用coalesce函数,但需要大小相同的数据帧 范例 x <- data.frame( ID = c(1,2,3,4,5), Location = c("Georgia", NA, NA, "Idaho", "Texas"), Cost = c(NA, 200, NA, 400, 500) ) y <- data.
x <- data.frame(
ID = c(1,2,3,4,5),
Location = c("Georgia", NA, NA, "Idaho", "Texas"),
Cost = c(NA, 200, NA, 400, 500)
)
y <- data.frame(
ID = c(1, 2, 3),
Location = c("Wyoming", "Florida", "Toronto"),
Cost = c(150, 100, 450)
)
Desired Result
ID Location Cost
1 Georgia 150
2 Florida 200
3 Toronto 450
4 Idaho 400
5 Texas 500
x您可以进行full\u连接
,然后对位置
和成本
列使用合并
library(dplyr)
full_join(x, y, by = 'ID') %>%
mutate(Location = coalesce(Location.x, Location.y),
Cost = coalesce(Cost.x, Cost.y)) %>%
select(names(x))
# ID Location Cost
#1 1 Georgia 150
#2 2 Florida 200
#3 3 Toronto 450
#4 4 Idaho 400
#5 5 Texas 500
transform(merge(x, y, by = 'ID', all = TRUE),
Location = ifelse(is.na(Location.x), Location.y, Location.x),
Cost = ifelse(is.na(Cost.x), Cost.y, Cost.x))[names(x)]
在base R中,我们可以使用ifelse
从Location
和Cost
列中选择值
library(dplyr)
full_join(x, y, by = 'ID') %>%
mutate(Location = coalesce(Location.x, Location.y),
Cost = coalesce(Cost.x, Cost.y)) %>%
select(names(x))
# ID Location Cost
#1 1 Georgia 150
#2 2 Florida 200
#3 3 Toronto 450
#4 4 Idaho 400
#5 5 Texas 500
transform(merge(x, y, by = 'ID', all = TRUE),
Location = ifelse(is.na(Location.x), Location.y, Location.x),
Cost = ifelse(is.na(Cost.x), Cost.y, Cost.x))[names(x)]
在数据框y
,Florida
的成本为100
。为什么它会以期望输出的200
成本结束?怀俄明州在哪里?这很有用,尽管我的实际数据帧有问题。部分问题是我的数据帧包含特定ID的重复项和三重项。因此,ID 2可能有多行包含重复信息。因此,当我加入或合并集合时,我得到的数据帧的观测值比这两个数据帧中的任何一个都要多。@learning\u在飞行中,你可以在之后添加`>%distinct(ID,.keep\u all=TRUE)`在上面的答案中选择
,以便每个ID
只保留唯一的行。这将保留每个ID
中的第一行。