合并数据帧优先于一个在另一个上

时间:2018-02-20 06:20:54

标签: r merge dplyr

我有两个像下面这样的数据框,它们共享列名,但信息可能有冲突。 (第一个数据帧有更多信息(范围0-5),第二个数据帧更少(范围0和4)。 我使用dplyr或其他R包合并了这两个数据帧,但我想要做的是在可用时使用第一个数据帧中的信息,当我不使用第二个数据帧中的信息时。

例如,要合并的两个数据帧是

ID    col1   col2  
A      0      0
B      3      0
C      5      3
ID   col1    col2 
A     4       4
B     0       0
C     4       4
D     0       4
E     4       4

合并后我想要的是:

ID    col1   col2
A      4      4
B      3      0
C      5      3
D      0      4
E      4      4

1 个答案:

答案 0 :(得分:3)

一个选项可以是dplyrtidyr。首先使用0替换数据框中的NA,这有助于确定该值是否有效。 使用bind_rows合并两个数据框。然后在ID上进行分组,以便在该列上排列行。使用fillNA替换为同一ID的其他行。

# Data
df1 <- read.table(text="ID    col1   col2  
A      0      0
B      3      0
C      5      3", header = T, stringsAsFactors = F)

df2 <- read.table(text = "ID   col1    col2 
A     4       4
B     0       0
C     4       4
D     0       4
E     4       4", header = T, stringsAsFactors = F)

df1[df1==0] <- NA
df2[df2==0] <- NA

library(dplyr)
library(tidyr)

df1 %>% bind_rows(df2) %>%
  group_by(ID) %>%
  fill(col1, col2, .direction = "up")  %>%
  fill(col1, col2, .direction = "down") %>%
  unique() %>%
  filter((row_number() == 1)) 

#Result
#  ID     col1  col2
#  <chr> <int> <int>
#1 A         4     4
#2 B         3    NA
#3 C         5     3
#4 D        NA     4
#5 E         4     4

注意: NA可以替换为0