Weź tę prostą ramkę danych połączonych identyfikatorów:zidentyfikować grupy epizodów połączonych których łańcuch razem
test <- data.frame(id1=c(10,10,1,1,24,8),id2=c(1,36,24,45,300,11))
> test
id1 id2
1 10 1
2 10 36
3 1 24
4 1 45
5 24 300
6 8 11
I teraz chcą zgrupować wszystkie identyfikatory, które łączą. Przez "link" mam na myśli śledzenie łańcucha linków, aby wszystkie identyfikatory w jednej grupie były oznaczone razem. Rodzaj rozgałęzionej struktury. tj .:
Group 1
10 --> 1, 1 --> (24,45)
24 --> 300
300 --> NULL
45 --> NULL
10 --> 36, 36 --> NULL,
Final group members: 10,1,24,36,45,300
Group 2
8 --> 11
11 --> NULL
Final group members: 8,11
Teraz z grubsza znam logikę, jakiej bym chciał, ale nie wiem, jak ją zrealizować elegancko. Myślę o rekursywnym użyciu match
lub %in%
, aby przejść do każdej gałęzi, ale tym razem jestem naprawdę zakłopotany.
Wynik końcowy będę pogoni jest:
result <- data.frame(group=c(1,1,1,1,1,1,2,2),id=c(10,1,24,36,45,300,8,11))
> result
group id
1 1 10
2 1 1
3 1 24
4 1 36
5 1 45
6 1 300
7 2 8
8 2 11
Życzę WIĘCEJ, a to pytanie było dostępne 25 lat temu, kiedy waliłem głową w ścianę z SAS próbując rozwiązać to pytanie. –
@bondeddust - przypadkowo to pytanie powstało w wyniku próby zastąpienia brzydkiego i nieefektywnego fragmentu kodu SAS, który zrobił coś podobnego. – thelatemail