首页 > 解决方案 > 将 DataFrame 转换为 R 中的邻接/权重矩阵

问题描述

我有一个数据框,df.

n是一列,表示列中的组数x
x是包含逗号分隔组的列。

df <- data.frame(n = c(2, 3, 2, 2), 
                 x = c("a, b", "a, c, d", "c, d", "d, b"))

> df
n        x
2     a, b
3  a, c, d
2     c, d
2     d, b

我想将此 DataFrame 转换为权重矩阵,其中行名和列名是 中组的唯一值,df$x元素表示每个组一起出现在 中的次数df$x

输出应如下所示:

m <- matrix(c(0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 2, 1, 1, 2, 0), nrow = 4, ncol = 4)
rownames(m) <- letters[1:4]; colnames(m) <- letters[1:4]

> m
  a b c d
a 0 1 1 1
b 1 0 0 1
c 1 0 0 2
d 1 1 2 0

标签: rmatrixadjacency-matrix

解决方案


这是一个非常粗糙且可能非常低效的解决方案,tidyverse用于争论和combinat生成排列。

library(tidyverse)
library(combinat)

df <- data.frame(n = c(2, 3, 2, 2), 
                 x = c("a, b", "a, c, d", "c, d", "d, b"))

df %>% 
    ## Parse entries in x into distinct elements
    mutate(split = map(x, str_split, pattern = ', '), 
           flat = flatten(split)) %>% 
    ## Construct 2-element subsets of each set of elements
    mutate(combn = map(flat, combn, 2, simplify = FALSE)) %>% 
    unnest(combn) %>% 
    ## Construct permutations of the 2-element subsets
    mutate(perm = map(combn, permn)) %>% 
    unnest(perm) %>% 
    ## Parse the permutations into row and column indices
    mutate(row = map_chr(perm, 1), 
           col = map_chr(perm, 2)) %>% 
    count(row, col) %>% 
    ## Long to wide representation
    spread(key = col, value = nn, fill = 0) %>% 
    ## Coerce to matrix
    column_to_rownames(var = 'row') %>% 
    as.matrix()

推荐阅读