首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:枚举两个向量中的匹配项

R:枚举两个向量中的匹配项
EN

Stack Overflow用户
提问于 2021-06-08 20:04:33
回答 4查看 37关注 0票数 3

我正在处理一个包含情侣信息的数据集。由列ID1中的唯一ID标识的情侣中的人员1与由列ID2中的唯一ID标识的情侣中的人员2形成情侣。数据集如下所示:

代码语言:javascript
复制
stack <- cbind(ID1 =         c(1, 2, 2, 3, 4, 4, 4, 5, 6), 
               ID2 =         c(4, 3, 3, 2, 1, 1, 1, 6, 5),
               what_I_want = c(1, 2, 2, 2, 1, 1, 1, 3, 3))

我想要的只是不同情侣的枚举。您可以在专栏what_I_want中看到我的意思。这项任务并不容易,因为我有几行是关于同一对夫妇的(比如第1、5、6和7行都是关于同一对夫妇的,1号夫妇)。最重要的是,并不是所有的配对都有相同的行数(比如配对1将显示在4行中,配对2将显示在3行中,依此类推)。这就是为什么我正在为此而苦苦挣扎的原因。我想过for循环和合并,但我不知道怎么做。如有任何帮助,我们将不胜感激<3

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-06-08 20:21:57

带有igraph + stack + merge的选项

代码语言:javascript
复制
merge(df,
  stack(
    membership(
      components(
        graph_from_data_frame(df)
      )
    )
  ),
  by.x = "ID1",
  by.y = "ind",
  all.x = TRUE
)

这给了我们

代码语言:javascript
复制
  ID1 ID2 values
1   1   4      1
2   2   3      2
3   2   3      2
4   3   2      2
5   4   1      1
6   4   1      1
7   4   1      1
8   5   6      3
9   6   5      3
票数 0
EN

Stack Overflow用户

发布于 2021-06-08 20:17:29

一种方便的选择是使用igraph

代码语言:javascript
复制
grp <- clusters(graph_from_data_frame(df[1:2]))$membership
df$what_I_want <- grp[match(df$ID1, names(grp))]

  ID1 ID2 what_I_want
1   1   4           1
2   2   3           2
3   2   3           2
4   3   2           2
5   4   1           1
6   4   1           1
7   4   1           1
8   5   6           3
9   6   5           3
票数 3
EN

Stack Overflow用户

发布于 2021-06-08 20:15:22

如果您的If是数字值,则可以使用dplyr

代码语言:javascript
复制
library(dplyr)

stack %>%
  as.data.frame() %>%
  mutate(small = pmin(ID1, ID2),
         large = pmax(ID1, ID2)) %>%
  group_by(small, large) %>%
  mutate(number = cur_group_id()) %>%
  ungroup() %>%
  select(-small, -large)

返回

代码语言:javascript
复制
# A tibble: 9 x 4
    ID1   ID2 what_I_want number
  <dbl> <dbl>       <dbl>  <int>
1     1     4           1      1
2     2     3           2      2
3     2     3           2      2
4     3     2           2      2
5     4     1           1      1
6     4     1           1      1
7     4     1           1      1
8     5     6           3      3
9     6     5           3      3

首先,我们按大小对ID进行排序,因此(1,4)(4,1)都被转换为(1,4)。最后,我们使用这些排序的id作为分组变量,并添加一个组id。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67886543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档