gpt4 book ai didi

r - 将多个分组索引连接成一个

转载 作者:行者123 更新时间:2023-12-04 15:29:27 28 4
gpt4 key购买 nike

我面临一个问题,我必须将各种分组索引连接成一个。这是一个例子:

df <- data.frame(idx1 = c("1_1","1_1","1_2","1_3","1_4","1_4","1_5","1_6","1_6"),
idx2 = c("2_1","2_2","2_2","2_3","2_4","2_5","2_6","2_7","2_8"),
idx3 = c("3_1","3_1","3_2","3_3","3_3","3_5","3_6","3_7","3_8"))


idx1 idx2 idx3
1 1_1 2_1 3_1
2 1_1 2_2 3_1
3 1_2 2_2 3_2
4 1_3 2_3 3_3
5 1_4 2_4 3_3
6 1_4 2_5 3_5
7 1_5 2_6 3_6
8 1_6 2_7 3_7
9 1_6 2_8 3_8

每个索引表示使用不同方法检测到的重复行。我想创建一个连接三者的索引。例如,idx1表示第1行和第2行相同,idx2表示第2行和第3行相同,所以第1、2、3行相同,应该具有相同的分组索引。

第 4 行和第 5 行具有相同的 idx3 分组索引,第 5 行和第 6 行具有相同的 idx1,因此它们应该具有相同的分组索引,与第 1 行不同, 2 和 3。

我确实设法编写了一个循环来创建连接索引:

df$I <- seq(df$idx1)
df$doublon_idx <- as.numeric(NA)
idx_cnt <- 1
for(i in 1:dim(df)[1]){
if(is.na(df[i,"doublon_idx"])){
df[i,"doublon_idx" ] <- idx_cnt
idx_cnt <- idx_cnt + 1
}
df[df$I != i & df$idx1 == df[i,]$idx1,"doublon_idx"] <- df[i,"doublon_idx"]
df[df$I != i & df$idx2 == df[i,]$idx2,"doublon_idx"] <- df[i,"doublon_idx"]
df[df$I != i & df$idx3 == df[i,]$idx3,"doublon_idx"] <- df[i,"doublon_idx"]
}

(预期的)输出是:

  idx1 idx2 idx3 I doublon_idx
1 1_1 2_1 3_1 1 1
2 1_1 2_2 3_1 2 1
3 1_2 2_2 3_2 3 1
4 1_3 2_3 3_3 4 2
5 1_4 2_4 3_3 5 2
6 1_4 2_5 3_5 6 2
7 1_5 2_6 3_6 7 3
8 1_6 2_7 3_7 8 4
9 1_6 2_8 3_8 9 4

但我对此并不满意:它不是通用的,它使用循环,所以当表变大时速度很慢。我确信有一种合并的方式,或者是一种我没有找到的聪明的方式。你的是什么?是否可以推广到任意数量的分组索引?

dplyrdata.table 是受欢迎的(尽管我更喜欢 data.table 如果你可以两者都做的话)

最佳答案

不确定这对您的实际数据集有多快。下面是结合 igraphdata.table 的方法:

library(data.table)
setDT(df)[, rn := .I]

#create edges and idx* are your vertices
DT <- rbindlist(list(
df[, .(s=idx1, e=idx2, rn)],
df[, .(s=idx1, e=idx3, rn)],
df[, .(s=idx2, e=idx3, rn)]))

#find linked clusters
library(igraph)
g <- graph_from_data_frame(DT, directed=FALSE)
cl <- clusters(g)$membership))

#look up cluster for each vertex
DT[, g := cl[s]]

#look up grouping for each vertex
df[unique(DT, by="rn"), on=.(rn), doublon_idx := g]

例如输出1:

   idx1 idx2 idx3 rn doublon_idx
1: 1_1 2_1 3_1 1 1
2: 1_1 2_2 3_1 2 1
3: 1_2 2_2 3_2 3 1
4: 1_3 2_3 3_3 4 2
5: 1_4 2_4 3_3 5 2
6: 1_4 2_5 3_5 6 2
7: 1_5 2_6 3_6 7 3
8: 1_6 2_7 3_7 8 4
9: 1_6 2_8 3_8 9 4

例如输出2:

   idx1 idx2 idx3 rn doublon_idx
1: 1_1 2_1 3_1 1 1
2: 1_1 2_2 3_1 2 1
3: 1_2 2_2 3_2 3 1
4: 1_3 2_3 3_3 4 2
5: 1_4 2_4 3_3 5 2
6: 1_4 2_5 3_5 6 2
7: 1_5 2_6 3_6 7 3
8: 1_6 2_7 3_7 8 4
9: 1_6 2_8 3_8 9 4

关于r - 将多个分组索引连接成一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61528131/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com