【问题标题】:Merge dataframe in R without duplicates在R中合并数据框而不重复
【发布时间】:2021-12-04 10:51:30
【问题描述】:

我在 R 中有一个与此类似的问题:

merge pandas dataframe with key duplicates

在 R 中做到这一点应该不难,但我只是找不到解决方案。

非常感谢您的帮助!

【问题讨论】:

  • 提供类似问题的参考链接很有帮助,但您的问题不应完全依赖于另一个问题。预计您在 R 中包含数据和尝试解决问题。如果您链接问题中的 OP 决定删除该问题,那么您的问题将变得毫无意义,并且对未来的访问者没有用处。

标签: r dataframe join merge


【解决方案1】:

通过'key'在每个数据中创建一个序列列,然后执行full_join

library(dplyr)
library(data.table)
df1 %>%
    mutate(rn = rowid(key)) %>% 
   full_join(df2 %>% 
              mutate(rn = rowid(key))) %>%
   select(-rn)

-输出

 key    A    B
1  K0   A0   B0
2  K1   A1   B1
3  K2   A2   B2
4  K2   A3   B3
5  K2   A4 <NA>
6  K3   A5   B4
7  K3 <NA>   B5
8  K4 <NA>   B6

数据

df1 <- structure(list(key = c("K0", "K1", "K2", "K2", "K2", "K3"), A = c("A0", 
"A1", "A2", "A3", "A4", "A5")), class = "data.frame", 
row.names = c("0", 
"1", "2", "3", "4", "5"))

df2 <- structure(list(key = c("K0", "K1", "K2", "K2", "K3", "K3", "K4"
), B = c("B0", "B1", "B2", "B3", "B4", "B5", "B6")), 
class = "data.frame", row.names = c("0", 
"1", "2", "3", "4", "5", "6"))

【讨论】:

  • @akrun:序列栏我看不懂!你能解释一下吗?非常感谢大师!
  • @TarJae OP 的数据与 by 列重复,即键。如果存在欺骗,则连接将导致笛卡尔连接。为避免这种情况,我们按“键”row_number 创建一个组。使用data.table,rowid 可以更轻松地完成,无需分两步完成。因此,连接将是 by 'rn' 和 'key' 即现在它是按列/s 唯一的
【解决方案2】:

akrun 的答案太棒了(另见 cmets):我又学到了一些新东西:

大部分都使用rowid{data.table},这是一个用于在每个组中生成唯一行 ID 的便捷函数。

仅dplyr 的解决方案需要两个步骤:

library(dplyr)
df1 %>% 
  group_by(key) %>% 
  mutate(id = row_number()) %>% 
  full_join(df2 %>% 
              group_by(key) %>% 
              mutate(id=row_number())) %>% 
  select(-id)

  key   A     B    
  <chr> <chr> <chr>
1 K0    A0    B0   
2 K1    A1    B1   
3 K2    A2    B2   
4 K2    A3    B3   
5 K2    A4    NA   
6 K3    A5    B4   
7 K3    NA    B5   
8 K4    NA    B6 

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2018-09-04
    • 2020-04-10
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多