我有两个像下面这样的数据框,它们共享列名,但信息可能有冲突。 (第一个数据帧有更多信息(范围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
答案 0 :(得分:3)
一个选项可以是dplyr
和tidyr
。首先使用0
替换数据框中的NA
,这有助于确定该值是否有效。
使用bind_rows
合并两个数据框。然后在ID
上进行分组,以便在该列上排列行。使用fill
将NA
替换为同一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