确定链接在一起的情节的群组

采取以下简单的链接ID数据框:


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

我现在要将所有链接的ID组合在一起。“链接”是指按照链接链进行操作,以便将一组中的所有ID一起标记。一种分支结构。即:


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

现在,我大致了解了我想要的逻辑,但是不知道如何优雅地实现它。我正在考虑递归地使用match或%in%遍历每个分支,但是这次确实很困惑。


我要追求的最终结果是:


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


慕森王
浏览 433回答 3
3回答

开心每一天1111

不使用包:# 2 sets of test datamytest <- data.frame(id1=c(10,10,3,1,1,24,8,11,32,11,45),id2=c(1,36,50,24,45,300,11,8,32,12,49))test <- data.frame(id1=c(10,10,1,1,24,8),id2=c(1,36,24,45,300,11))grouppairs <- function(df){&nbsp; # from wide to long format; assumes df is 2 columns of related id's&nbsp; test <- data.frame(group = 1:nrow(df),val = unlist(df))&nbsp; # keep moving to next pair until all same values have same group&nbsp; i <- 0&nbsp; while(any(duplicated(unique(test)$val))){&nbsp; &nbsp; i <- i+1&nbsp; &nbsp; # get group of matching values&nbsp; &nbsp; matches <- test[test$val == test$val[i],'group']&nbsp; &nbsp; # change all groups with matching values to same group&nbsp; &nbsp; test[test$group %in% matches,'group'] <- test$group[i]&nbsp; }&nbsp; # renumber starting from 1 and show only unique values in group order&nbsp; test$group <- match(test$group, sort(unique(test$group)))&nbsp; unique(test)[order(unique(test)$group), ]}# testgrouppairs(test)grouppairs(mytest)
打开App,查看更多内容
随时随地看视频慕课网APP