У меня следующая проблема. У меня в таблице два идентификатора, и мне нужно иметь возможность создать один идентификатор для всей группы, в этих двух идентификаторах есть ссылка. Пример очистит все:
library(dplyr)
df
# A tibble: 12 x 4
id_1 id_2 val res_col
<chr> <chr> <dbl> <chr>
1 G NA 1.01 G
2 G NA -0.255 G
3 G NA 0.595 G
4 Z G -0.881 G
5 Z G -0.127 G
6 Z G 0.399 G
7 R NA 0.749 R
8 R NA -0.447 R
9 R NA -1.70 R
10 D Z 0.118 G
11 D Z 0.000169 G
12 D Z -0.522 G
Вот пример и столбец результата, который мне нужен. Проблема в том, что id_1
- это мой исходный идентификатор, а id_2
- это вторичный идентификатор, который сообщает, с каким исходным идентификатором связан вторичный идентификатор. Таким образом, G сам по себе, Z связан с G, R сам по себе, а D на самом деле полностью связан с G через Z. Я хотел бы получить первые id_1
для каждой группы. У меня нет способа сортировки таблицы, чтобы добиться каких-либо отношений отставания / опережения. res_col
это то, что я хотел бы получить.
edit 1, в моих исходных данных могут быть десятки таких ссылок.
редактировать 2, у меня более 100 тыс. записей, и я не знаю, что это за ссылки.
DATA:
df <- tibble(id_1 = c(rep("G", 3), rep("Z", 3), rep("R", 3), rep("D", 3)),
id_2 = c(rep(NA, 3), rep("G", 3), rep(NA, 3), rep("Z", 3)),
val = rnorm(n = 12),
res_col = c(rep("G", 6), rep("R", 3), rep("G", 3)))
Мои мысли и то, что я сейчас пытаюсь. Я немного убрал использование igraph, возможно, еще будут и лучшие, но пока займусь этим. Спасибо.
library(dplyr)
library(igraph)
df <- tibble(id_1 = c(rep("G", 3), rep("Z", 3), rep("R", 3), rep("D", 3)),
id_2 = c(rep(NA, 3), rep("G", 3), rep(NA, 3), rep("Z", 3)),
val = rnorm(n = 12),
res_col = c(rep("G", 6), rep("R", 3), rep("G", 3)))
groups <- df %>%
select(id_1, id_2) %>%
mutate(id_2 = case_when(is.na(id_2) ~ id_1,
TRUE ~ id_2)) %>%
graph_from_data_frame(.) %>%
components(.) %>%
.$membership %>%
tibble(id_1 = names(.),
group = .)
groups %>%
group_by(group) %>%
mutate(group_id = id_1[1]) %>%
ungroup() %>%
select(id_1, group_id) %>%
right_join(df, by = "id_1")
# A tibble: 12 x 5
id_1 group_id id_2 val res_col
<chr> <chr> <chr> <dbl> <chr>
1 G G NA 1.06 G
2 G G NA -0.908 G
3 G G NA 0.320 G
4 Z G G -0.733 G
5 Z G G 1.10 G
6 Z G G 1.50 G
7 R R NA -2.28 R
8 R R NA 0.201 R
9 R R NA 0.641 R
10 D G Z 1.54 G
11 D G Z 0.160 G
12 D G Z -0.430 G