r - 通过列的精确匹配合并数据框

标签 r dataframe merge conditional-statements match

我想合并两个数据框,其中一个有更多变量(列),而另一个有更多观察结果(行)。它们的设置方式的简化示例如下:

数据框1:

ID      Date         Indicator
12345   01/01/2008   1
54321   12/01/2008   1

数据框2:

ID      Date         
12345   01/01/2008   
12345   01/31/2008
12345   02/28/2009
24681   01/01/2008
54321   12/01/2008
54321   12/20/2008

我想做的只是保留 ID 完全匹配的行。例如,我想要以下输出:

新数据框:

ID      Date         Indicator     
12345   01/01/2008   1
12345   01/31/2008   NA
12345   02/28/2009   NA
54321   12/01/2008   1
54321   12/20/2008   NA

我已经尝试过

new <- merge(df1, df2, all=TRUE)

但这会导致所有行的合并,而我只想要 df2 中具有在 df1 中看到的 ID 的行。

感谢任何帮助!

最佳答案

您可以尝试使用 dplyr 解决方案:

library(dplyr)
# a right join when you filter Dataframe2 by ID in Dataframe1
Dataframe1 %>% right_join(Dataframe2[Dataframe2$ID %in% Dataframe1$ID,])  

Joining, by = c("ID", "Date")
     ID       Date Indicator
1 12345 01/01/2008         1
2 12345 01/31/2008        NA
3 12345 02/28/2009        NA
4 54321 12/01/2008         1
5 54321 12/20/2008        NA

# clearly you can put it in a data.frame
Dataframe3 <- Dataframe1 %>% right_join(Dataframe2[Dataframe2$ID %in% Dataframe1$ID,], by = 'ID') %>% 
             data.frame()

因此,您不会有 ID 24681,并且在 Indicator 中您将看到 NA,这似乎是必要的,即当 Date 确实如此时不想要它。


您的数据:

Dataframe1 <- read.table(text="ID      Date         Indicator
12345   01/01/2008   1
54321   12/01/2008   1", stringsAsFactors = F, header = T)

Dataframe2 <- read.table(text="ID      Date         
12345   01/01/2008   
12345   01/31/2008
12345   02/28/2009
24681   01/01/2008
54321   12/01/2008
54321   12/20/2008",stringsAsFactors = F, header = T)

关于r - 通过列的精确匹配合并数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52635089/

相关文章:

python - 扩展字典数据框列表

python - Pandas 选择读取 JSON 的行

r - 如何从 R bubbleGoogleMaps 获取比例气泡大小?

r - 如何仅使用 getSymbols 将多个收盘价下载到单独的 xts 文件中?

r - 几个月没有前导零 R

r - 多个估算数据集 - 汇集结果

Python Pandas 更新数据框列类型

mysql - 当列应该变得唯一时合并相关数据

R merge() 不再按预期工作

git - 撤消已推送的 merge