我正在处理一个包含情侣信息的数据集。由列ID1中的唯一ID标识的情侣中的人员1与由列ID2中的唯一ID标识的情侣中的人员2形成情侣。数据集如下所示:
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
发布于 2021-06-08 20:21:57
带有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发布于 2021-06-08 20:17:29
一种方便的选择是使用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发布于 2021-06-08 20:15:22
如果您的If是数字值,则可以使用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。
https://stackoverflow.com/questions/67886543
复制相似问题