枚举匹配两个向量之间的元素

3
我正在处理一个关于夫妻情侣信息的数据集。该数据集包含有关每个情侣中第一个人的信息,通过他们在列 ID1 中的唯一 ID 进行识别。每对情侣的第二个人则通过他们在列 ID2 中的唯一 ID 进行识别。该数据集如下所示:
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

4个回答

3

一个方便的选择是使用 igraph

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

2

这里有一个基于R的选项 -

vec <- with(df, paste(pmin(ID1, ID2), pmax(ID1, ID2)))
df$result <- match(vec, unique(vec))
df

#  ID1 ID2 result
#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

2

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

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)

返回值

# 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。

0

igraph + stack + merge 的选项

merge(df,
  stack(
    membership(
      components(
        graph_from_data_frame(df)
      )
    )
  ),
  by.x = "ID1",
  by.y = "ind",
  all.x = TRUE
)

这提供了

  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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接