在 R 中链接具有记录扩展的记录 [duplicate]

Linking records with record expansion in R [duplicate]

提问人:sparklink 提问时间:9/7/2023 更新时间:9/7/2023 访问量:69

问:

我有一个大数据帧,看起来像这样:

编号 x
1 123
2 123
2 125
3 125
4 200
tibble(id = c(1, 2, 2, 3, 4),
       x = c(123, 123, 125, 125, 200))

我想链接我的记录并扩展它们。也就是说,如果它们具有相同的 ID,它们应该具有相同的 ID。请注意,记录 2 和 3 被视为同一实体,因为它们与 1 共享链接。换言之,如果没有记录 1,则记录 2 和 3 将不会链接。我还想给它记录链接的最小值。xididid

结果应如下所示:

编号 x
1 123
1 123
1 125
1 125
4 200
r dplyr tidyverse 记录链接

评论


答:

4赞 Allan Cameron 9/7/2023 #1

重述这个问题的等效方法是“如果数据帧表示有向图的'to'和'from'节点,那么图的每个唯一组件的第一个ID是什么?

我们可以用图形方式显示这一点:

library(igraph)
library(tidyverse)

df <- tibble(id = c(1, 2, 2, 3, 4),
             x = c(123, 123, 125, 125, 200))

g <- graph_from_data_frame(df)

如果我们绘制图形,我们将看到有两个未连接的节点集群(称为组件);一个用于分组 ID 1:3,一个用于 ID 4:

plot(g)

我们可以使用该函数来计算每个 ID 属于哪个组,并获取每个组中的 ID:componentsfirst

comp <- components(g)$membership

df %>%
  mutate(group = comp[match(id, names(comp))]) %>%
  mutate(id = first(id), .by = 'group') %>%
  select(-group)
#> # A tibble: 5 x 2
#>      id     x
#>   <dbl> <dbl>
#> 1     1   123
#> 2     1   123
#> 3     1   125
#> 4     1   125
#> 5     4   200

创建于 2023-09-07 使用 reprex v2.0.2