我有两个如下所示的数据框,它们共享列名称,但信息可能会发生冲突。 (第一个数据帧包含更多信息(范围 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
最佳答案
一种选择是使用 dplyr
和 tidyr
。首先用 NA
替换数据帧中的 0
,这有助于确定该值是否有效。
使用 bind_rows
合并两个数据帧。然后根据 ID
进行分组,以便将行排列在该列上。使用 fill
替换同一 ID
的其他行中的 NA
。
# 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
关于r - 合并数据帧,优先级高于另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48879055/