【问题标题】:How to pull out ids in R that are interlinked?如何提取R中相互关联的ID?
【发布时间】:2020-12-04 15:37:38
【问题描述】:

我有两列 id1 和 id2,它们具有相互关联的 id 列表。我正在寻找 R 中的解决方案,可以根据它们的关系将这些 id 拉到一起。基本思想是 id 的 313-320 都是相互关联的,例如313 链接到 314(第 1 行),因为 314 链接到 316(第 7 行),所以 313 和 316 也链接,依此类推。解决方案必须以某种方式探索这些联系并将它们放在一个链中,这样 313-320 将在一个链中,321-328 将在第二个链中。

id1<-c(313,313,313,313,313,314,314,314,314,315,317,317,317,318,318,319,321,321,321,321,321,321,321,322,322,322,322,322, 322,323,323,323,323,323,324,324,324,324,325,325,325,326,326,327)

id2<-c(314,315,316,319,320,315,316,319,320,316,318,319,320,319,320,320,322,323,324,325,326,327,328,323,324,325,326,327, 328,324,325,326,327,328,325,326,327,328,326,327,328,327,328,328)

df<-cbind.data.frame(id1, id2)

> df
   id1 id2
1  313 314
2  313 315
3  313 316
4  313 319
5  313 320
6  314 315
7  314 316
8  314 319
9  314 320
10 315 316
11 317 318
12 317 319
13 317 320
14 318 319
15 318 320
16 319 320
17 321 322
18 321 323
19 321 324
20 321 325
21 321 326
22 321 327
23 321 328
24 322 323
25 322 324
26 322 325
27 322 326
28 322 327
29 322 328
30 323 324
31 323 325
32 323 326
33 323 327
34 323 328
35 324 325
36 324 326
37 324 327
38 324 328
39 325 326
40 325 327
41 325 328
42 326 327
43 326 328
44 327 328

非常感谢您在这里输入如何实现这一点?

【问题讨论】:

    标签: r relationship


    【解决方案1】:
    id1<-c(313,313,313,313,313,314,314,314,314,315,317,317,317,318,318,319,321,321,321,321,321,321,321,322,322,322,322,322, 322,323,323,323,323,323,324,324,324,324,325,325,325,326,326,327)
    
    id2<-c(314,315,316,319,320,315,316,319,320,316,318,319,320,319,320,320,322,323,324,325,326,327,328,323,324,325,326,327, 328,324,325,326,327,328,325,326,327,328,326,327,328,327,328,328)
    
    df<-cbind.data.frame(id1, id2)
    

    这有点乱,但它有效。您只需设置要分组的行(这里是 1 - 16,然后是 17-44)

    df<-data.frame(row1=unlist(df[1:16,])[which(!duplicated(unlist(df[1:16,])))],
    row2=unlist(df[17:44,])[which(!duplicated(unlist(df[17:44,])))]
    )
    

    作为两个不同的列:

    df
              row1 row2
    id11   313  321
    id16   314  322
    id110  315  323
    id111  317  324
    id114  318  325
    id116  319  326
    id23   316  327
    id25   320  328
    

    或作为两行,如您指定的那样:

    t(df)
         id11 id16 id110 id111 id114 id116 id23 id25
    row1  313  314   315   317   318   319  316  320
    row2  321  322   323   324   325   326  327  328
    

    编辑:

    由于您正在寻找可以选择值范围的答案,因此可以使用以下方法:

    id1<-c(313,313,313,313,313,314,314,314,314,315,317,317,317,318,318,319,321,321,321,321,321,321,321,322,322,322,322,322, 322,323,323,323,323,323,324,324,324,324,325,325,325,326,326,327)
    
    id2<-c(314,315,316,319,320,315,316,319,320,316,318,319,320,319,320,320,322,323,324,325,326,327,328,323,324,325,326,327, 328,324,325,326,327,328,325,326,327,328,326,327,328,327,328,328)
    
    df<-cbind.data.frame(id1, id2)
    
    
    
    df2<-unlist(df)[which(!duplicated(unlist(df)))]
    
    rows1<-c(313:320)
    rows2<-c(321:328)
    
    
    df3<-data.frame(row1=df2[which(df2%in%rows1)],
                   row2=df2[which(df2%in%rows2)]
    )
    df3
    
    > df3
          row1 row2
    id11   313  321
    id16   314  322
    id110  315  323
    id111  317  324
    id114  318  325
    id116  319  326
    id23   316  327
    id25   320  328
    

    【讨论】:

    • 我认为这里的问题真的是我什至不知道哪些行可以分组,这只是一个例子,所以我指定分组来解释但在真实数据中我没有这样的线索。解决方案需要以某种方式基于链接而不真正指定分组,以便可以将连接的数据中的所有数字拉到一起并分组到单独的行中。
    • 你想清楚了吗?如果您还没有,我可以编辑我的答案以包含它。
    • 那太好了。我还没有找到最好的方法。
    • 现在是否更接近您的目标?
    • 这个解决方案接近我想要的,但仍然不是我想要的。原因是我不知道哪些行可以组合在一起。想象一下,在我没有分组信息的情况下,第 1 行和第 2 行中的 id 对随机分布,那将如何工作。这个想法是 id 的 313-320 像链一样链接,例如313 链接到 314(第 1 行),因为 314 链接到 316(第 7 行),所以 313 和 316 链接等等。解决方案必须以某种方式探索这些联系并将它们像链一样放在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2012-01-22
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多