r - 从集群信息中查找网络链接

标签 r dataframe combn

我有如下所示的网络数据:

data <- data.frame(id = as.character(1:20),
                   cluster = sample(c("a", "b", "c"), 20, replace = T)) 
head(data)

# id cluster
# 1       b
# 2       b
# 3       c
# 4       a
# 5       c
# 6       a
# 7       a

过去,我已经成功地从链接中获取了集群数据,但反过来却不行。我尝试使用 igraph 包进行网络分析,但找不到能给我满意结果的函数,而且我不想依赖循环,因为它们效率低下,而且我通常尽量远离他们。

预期结果

我想知道是否有一种有效的方法来创建一个新的 data.frame,在一个集群中包含所有可能的“链接”,这样我就可以得到一个 data.frame 看起来像:

id1 id2 cluster
4   6       a
7   4       a
7   6       a
1   2       b
3   5       c

最佳答案

您可以在 中执行此操作:

set.seed(123)
data <- data.frame(id = as.character(1:20),
                   cluster = sample(c("a", "b", "c"), 20, replace = T))

library(data.table)
setDT(data)[, id:=as.character(id)][, t(combn(id, 2, FUN = list)), by = cluster]
#>     cluster V1 V2        #>     cluster V1 V2        #>     cluster V1 V2    
#>  1:       a  1 17        #> 21:       c 12  8        #> 41:       c  5  8    
#>  2:       a  1  7        #> 22:       c 12 13        #> 42:       c  5 13    
#>  3:       a  1  9        #> 23:       c 15 16        #> 43:       c  8 13    
#>  4:       a  1 10        #> 24:       c 15 19        #> 44:       b 14 18    
#>  5:       a  1 11        #> 25:       c 15  3        #> 45:       b 14 20    
#>  6:       a 17  7        #> 26:       c 15  5        #> 46:       b 14  2    
#>  7:       a 17  9        #> 27:       c 15  8        #> 47:       b 14  4    
#>  8:       a 17 10        #> 28:       c 15 13        #> 48:       b 14  6    
#>  9:       a 17 11        #> 29:       c 16 19        #> 49:       b 18 20    
#> 10:       a  7  9        #> 30:       c 16  3        #> 50:       b 18  2    
#> 11:       a  7 10        #> 31:       c 16  5        #> 51:       b 18  4    
#> 12:       a  7 11        #> 32:       c 16  8        #> 52:       b 18  6    
#> 13:       a  9 10        #> 33:       c 16 13        #> 53:       b 20  2    
#> 14:       a  9 11        #> 34:       c 19  3        #> 54:       b 20  4    
#> 15:       a 10 11        #> 35:       c 19  5        #> 55:       b 20  6    
#> 16:       c 12 15        #> 36:       c 19  8        #> 56:       b  2  4    
#> 17:       c 12 16        #> 37:       c 19 13        #> 57:       b  2  6    
#> 18:       c 12 19        #> 38:       c  3  5        #> 58:       b  4  6    
#> 19:       c 12  3        #> 39:       c  3  8            
#> 20:       c 12  5        #> 40:       c  3 13            

或在 :

set.seed(123)
data <- data.frame(id = as.character(1:20),
                   cluster = sample(c("a", "b", "c"), 20, replace = T))

library(dplyr)
data %>% group_by(cluster) %>% mutate(id=as.character(id)) %>% 
         do(data.frame(t(combn(.$id, 2))))
#> # A tibble: 58 x 3
#> # Groups:   cluster [3]
#>    cluster    X1    X2
#>    <fct>   <dbl> <dbl>
#>  1 a           1    17
#>  2 a           1     7
#>  3 a           1     9
#>  4 a           1    10
#>  5 a           1    11
#>  6 a          17     7
#>  7 a          17     9
#>  8 a          17    10
#>  9 a          17    11
#> 10 a           7     9
#> # ... with 48 more rows

reprex package 创建于 2019-05-16 (v0.2.1)

关于r - 从集群信息中查找网络链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56174405/

相关文章:

r - 根据一列中的最大值和唯一值过滤行

r - 一次评论多个对象

Pandas 根据列值 reshape 数据框

python - 将数据框转换为另一个数据框,将复合字符串单元格拆分为单独的行

r - 根据组合为列表中的数据框分配名称

regex - 如何在 R 中粘贴 "backslash-dot"(\.) 组合?

python - 如何计算python中点过程的残差

r - 在 R 中逐行合并多个 data.frame

r - 从 5 列中找出 3 行的所有组合的所有总和