Преобразовать категориальные данные в фрейме данных в матрицу взвешенной смежности
У меня есть следующий фрейм данных, назовите его 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