1

我有以下数据框,称为 DF,它是由三个向量组成的数据框:“块”“名称”和“频率”。我需要把它变成一个 NameXName 邻接矩阵,其中当名称位于同一个块中时,它们被认为是相邻的。例如,在第一行中,Gretel 和 Friedrich 是相邻的,因为它们都在 Chunk2 中。并且关系的权重应该基于“频率”,即它们在同一个块中共存的次数,因此对于 Gretel/Friedrich 示例,频率(Gretel)+频率(弗里德里希)-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 矩阵,但似乎这是矩阵太稀疏或太复杂(a %*% b 中的错误:需要数字/复杂矩阵/向量参数)。

非常感谢将此数据框放入邻接矩阵的任何帮助。

4

1 回答 1

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
于 2013-12-17T00:54:46.060 回答