左加入 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
我有一个数据框,其中的行被分成几组,我想将其与另一个更大的数据框合并,这些数据框大多具有相似的组。 然而,左连接将 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