左加入 r 中的组

left join for groups in r

我有一个数据框,其中的行被分成几组,我想将其与另一个更大的数据框合并,这些数据框大多具有相似的组。 然而,左连接将 return 右侧数据框中的所有匹配项,我只想保留 1 - 但对于同一组的下一个成员则不相同。

例如:

Res <- structure(list(ID.x = c(2L, 2L, 2L, 2L, 2L, 2L), Grp = c(1283L, 
1283L, 1283L, 1283L, 1283L, 1283L), ID.y = c(2338806L, 2365559L, 
2870579L, 3129523L, 3184604L, 3283854L)), row.names = c(NA, -6L
), class = c("tbl_df", "tbl", "data.frame"))

在这种情况下,左侧数据框中的元素 2 属于组 1283,该组包含右侧数据框中的 6 行。来自组 1283 的下一个成员将再次与相同的 6 行匹配。 我希望左侧数据框的每个成员都与右侧的一个成员完全匹配,无需替换 - 即匹配不会被多次使用。

不能 100% 确定这是否是您要查找的内容(请参阅 r2evans 的评论)。

假设你有两个数据集

df1 <- data.frame(ID = 1:10,
                  Grp = rep(c(1283, 3821), each = 5))

#>    ID  Grp
#> 1   1 1283
#> 2   2 1283
#> 3   3 1283
#> 4   4 1283
#> 5   5 1283
#> 6   6 3821
#> 7   7 3821
#> 8   8 3821
#> 9   9 3821
#> 10 10 3821

df2 <- data.frame(Grp = rep(c(1283, 3821), each = 5),
                  value = sample(1000000L, 10))

#>     Grp  value
#> 1  1283 678800
#> 2  1283  11465
#> 3  1283 452869
#> 4  1283 420348
#> 5  1283 315170
#> 6  3821 879067
#> 7  3821 226712
#> 8  3821 995733
#> 9  3821 121852
#> 10 3821   8437

并且您只想“使用”df2 的每个值一次,您可以创建一个用于连接的辅助列:

library(dplyr)

df1 %>% 
  group_by(Grp) %>% 
  mutate(rn = row_number()) %>% 
  left_join(df2 %>% group_by(Grp) %>% mutate(rn = row_number()), by = c("Grp", "rn")) %>% 
  select(-rn)

得到

# A tibble: 10 x 3
# Groups:   Grp [2]
      ID   Grp  value
   <int> <dbl>  <int>
 1     1  1283 678800
 2     2  1283  11465
 3     3  1283 452869
 4     4  1283 420348
 5     5  1283 315170
 6     6  3821 879067
 7     7  3821 226712
 8     8  3821 995733
 9     9  3821 121852
10    10  3821   8437