Преобразовать категориальные данные в фрейме данных в матрицу взвешенной смежности

У меня есть следующий фрейм данных, назовите его DF, который представляет собой фрейм данных, состоящий из трех векторов: "Чанк", "Имя" и "Частота". Мне нужно превратить его в матрицу смежности NameXName, где имена считаются смежными, когда они находятся в одном и том же фрагменте. Так, например, в первых строках Гретель и Фридрих смежны, потому что они оба в Чанке2. И вес отношения должен быть основан на "Частоте", именно на том числе, сколько раз они присутствуют в одном и том же фрагменте, поэтому для примера Гретель / Фридрих: Частота (Гретель)+ Частота (Фридрих)-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: требуются числовые / сложные матричные / векторные аргументы).

Любая помощь, помещающая этот фрейм данных в матрицу смежности, очень ценится.

1 ответ

Решение

Это то, что вы ищите?

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
Другие вопросы по тегам