r - 合并数据帧,优先级高于另一个

标签 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

最佳答案

一种选择是使用 dplyrtidyr。首先用 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/

相关文章:

r - 矩阵反对角线之和

重新定义R包中的功能

r - 如何根据列值创建附加行或数据框

c - 合并多个文件夹中的代码

r - 如何在 direct.label 中更改字体大小?

svn - 使用 git-svn 在 svn 中轻松 merge

svn - 使用 subversion 和 intellij 将主干与分支合并

r - 删除R中具有聚合组的重复项

r - 从假人中最简单地创建因子变量

r - 计算一个数字(因子)在每组中出现的次数