如何连接或合并不同大小的数据帧,同时覆盖R中缺失的值?

如何连接或合并不同大小的数据帧,同时覆盖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.

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.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
中的第一行。