【问题标题】:Merge dataframes prioritising one over another合并优先于另一个的数据帧
【发布时间】:2018-07-30 10:46:28
【问题描述】:

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

例如要合并的两个数据框是

标识 col1 col2 一个 0 0 乙 3 0 C 5 3 标识 col1 col2 一个 4 4 乙 0 0 C 4 4 0 4 E 4 4

合并后我想要的是:

标识 col1 col2 一个 4 4 乙 3 0 C 5 3 0 4 E 4 4

【问题讨论】:

  • 你能扩展一下“更有用”吗?看起来你的意思是“更大”。行 C 表明您想要来自 df1 的数据,因为它包含更大的范围 (5)。对吗?
  • @Amar 是的。我的意思是 more info df1 有更多 detailed 信息 bc 范围是 0-5,而 df2 有两个级别(0 和 4)。另一方面,df1 有三行,df2 有五行。从这个意义上说, df2 确实有更多信息。对不起,令人困惑的表达

标签: r merge dplyr


【解决方案1】:

一个选项可以使用dplyrtidyr。首先将数据帧中的0 替换为NA,这有助于确定该值是否有效。 使用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

【讨论】:

  • 如果在第二个data.frame第二行是B 0 1,那么第二行的输出将是B 3 1,据我了解它应该保持B 3 0
  • @Moody_Mudskipper 你是对的。在我的回答中,个人值(如果非零)将获得偏好。因此,它可以混合来自两行的数据。我认为这是OP的意图。否则事情可能会更容易。
  • 是的,OP 必须澄清一下,如果两个 dfs 中的含义不同,我很困惑他将如何理解这些数据。例如,C 行在col2 中显示了更大的值,因此在不保留源信息的情况下混合两个 dfs 对我来说没有意义。如果不是这条 C 线,我会建议 group_by summarize_all max
  • 不确定我是否正确理解了您上面的讨论,但我的意图如下(a-e);一种。我有一个包含两个(df1 和 df2)的数据集,其中我有客户偏好。湾。 df1 有五个范围(1-5)和零,但客户数量较少 c。 df2 具有二进制输入 (0,1),但适用于大量客户 d。我随意假设第二个数据帧中的 1 等价于 df1 e 中的 4。我想合并这两个 df,但由于上述原因,df1 具有更精确的输入,因此具有更高的优先级。
  • @MKR 没错。在这种情况下,我希望行 B3 4
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
相关资源
最近更新 更多