为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2019-12-06 15:09:18
采取以下简单的链接ID数据框:test <- data.frame(id1=c(10,10,1,1,24,8),id2=c(1,36,24,45,300,11))> test  id1 id21  10   12  10  363   1  244   1  455  24 3006   8  11我现在要将所有链接的ID组合在一起。“链接”是指按照链接链进行操作,以便将一组中的所有ID一起标记。一种分支结构。即:Group 110 --> 1,   1 --> (24,45)                   24 --> 300                          300 --> NULL                   45 --> NULL10 --> 36, 36 --> NULL,Final group members: 10,1,24,36,45,300Group 28 --> 11      11 --> NULLFinal 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  id1     1  102     1   13     1  244     1  365     1  456     1 3007     2   88     2  11
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

不使用包:


# 2 sets of test data

mytest <- 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){


  # from wide to long format; assumes df is 2 columns of related id's

  test <- data.frame(group = 1:nrow(df),val = unlist(df))


  # keep moving to next pair until all same values have same group

  i <- 0

  while(any(duplicated(unique(test)$val))){

    i <- i+1


    # get group of matching values

    matches <- test[test$val == test$val[i],'group']


    # change all groups with matching values to same group

    test[test$group %in% matches,'group'] <- test$group[i]

  }


  # renumber starting from 1 and show only unique values in group order

  test$group <- match(test$group, sort(unique(test$group)))

  unique(test)[order(unique(test)$group), ]

}


# test

grouppairs(test)

grouppairs(mytest)


查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 432 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信