将数据帧中的分类数据转换为加权邻接矩阵

时间:2013-12-17 00:25:40

标签: r matrix dataframe relational categorical-data

我有以下数据框,称之为DF,这是一个由三个向量组成的数据框:“Chunk”“Name”和“Frequency”。我需要把它变成一个NameXName邻接矩阵,当Names位于同一个chunk中时,它们被认为是相邻的。例如,在第一行中,Gretel和Friedrich是相邻的,因为它们都在Chunk2中。并且关系的权重应该基于“频率”,恰好是它们在同一块中共存的次数,因此对于Gretel / Friedrich示例,频率(Gretel)+频率(Friedrich)-1 = 5

    Chunk         Name Frequency  
1       2       Gretel         2  
2       2      Pollock         1 
3       2       Adorno         1   
4       2    Friedrich         4  
5       3          Max         1 
6       3   Horkheimer         1  
7       3       Adorno         1   
8       4    Friedrich         5  
9       4      Pollock         1 
10      4        March         1 
11      5        Comte         3  
12      7      Jaspers         1  
13      7       Huxley         2  
14      8    Nietzsche         1 
15      8         Sade         2 
16      8        Felix         1  
17      8         Weil         1 
18      8      Western         1 
19      8    Lowenthal         1 
20      8         Kant         1 
21      8       Hitler         1 

我开始根据DF $ Chunk分割数据框,

> DF.split<-split(DF, DF$Chunk) 

$`2`
  Chunk      Name Frequency
1     2    Gretel         2
2     2   Pollock         1
3     2    Adorno         1
4     2 Friedrich         4

$`3`
  Chunk       Name Frequency
5     3        Max         1
6     3 Horkheimer         1
7     3     Adorno         1

$`4`
   Chunk      Name Frequency
8      4 Friedrich         5
9      4   Pollock         1
10     4     March         1

我认为它更接近,但它返回列表项目,我无法转回可用数据框架。

我还尝试将其转换为ChunkXName邻接矩阵:

> chunkbyname<-tapply(DF$Frequency , list(DF$Name,DF$Chunk) , as.character )

希望将chunkbyname乘以其转置以获得NAmeXName矩阵,但似乎这是矩阵太稀疏或复杂(%*%b中的错误:需要数字/复杂矩阵/向量参数)。 / p>

任何帮助将此数据框纳入邻接矩阵的帮助都非常受欢迎。

1 个答案:

答案 0 :(得分:3)

这是你在找什么?

df3 <- by(df, df$Chunk, function(x){
  mm <- outer(x$Frequency, x$Frequency, "+") - 1
  rownames(mm) <- x$Name
  colnames(mm) <- x$Name
  mm
})

df3

# $`2`
#           Gretel Pollock Adorno Friedrich
# Gretel         3       2      2         5
# Pollock        2       1      1         4
# Adorno         2       1      1         4
# Friedrich      5       4      4         7
# 
# $`3`
#            Max Horkheimer Adorno
# Max          1          1      1
# Horkheimer   1          1      1
# Adorno       1          1      1
# 
# $`4`
#           Friedrich Pollock March
# Friedrich         9       5     5
# Pollock           5       1     1
# March             5       1     1