考虑一个数据集,其中每行都是一篮子 3 个水果。
library(data.table)
baskets <- data.table(fruit_1 = c('orange', 'apple', 'apple', 'pear')
,fruit_2 = c('apple', 'pear', 'kiwi', 'kiwi')
,fruit_3 = c('pear', 'kiwi', 'blueberry', 'blueberry'))
计算不同水果之间相关性的有效方法是什么?换句话说,不同的水果一起出现在同一个篮子/行中的频率是多少?我正在尝试获取每对 2 个水果的成对相关性(例如,“苹果和梨”、“苹果和猕猴桃”等)。
我现在能想到的最好的方法是为每个水果制作指示变量/二进制列,然后进行它们的相关性。有没有比这更好的方法,无论是计算方法还是其他方法?
编辑:我更新了这部分以显示一个看起来像我想要的结果的表格。它可能需要“同意/不同意分数”或其他东西而不是相关性,但你明白了。
baskets$apple = 0
baskets[fruit_1=='apple']$apple = 1
baskets[fruit_2=='apple']$apple = 1
baskets[fruit_3=='apple']$apple = 1
baskets$pear = 0
baskets[fruit_1=='pear']$pear = 1
baskets[fruit_2=='pear']$pear = 1
baskets[fruit_3=='pear']$pear = 1
baskets$kiwi = 0
baskets[fruit_1=='kiwi']$kiwi = 1
baskets[fruit_2=='kiwi']$kiwi = 1
baskets[fruit_3=='kiwi']$kiwi = 1
#looking for a table like this, but with every combination of fruit and imagining thousands of rows
desired_result = data.frame(fruit_1 = c('apple', 'pear', 'kiwi'),
fruit_2 = c('pear', 'kiwi', 'apple'),
similarity = c(cor(baskets$apple, baskets$pear),
cor(baskets$pear, baskets$kiwi),
cor(baskets$kiwi, baskets$apple)
)
)
这感觉是一个不错的解决方案,但不是一个很好的解决方案。所以我想看看有什么更好的选择。 Data.table 是非常可取的,因为我在这方面做得更好,但我对任何事情都持开放态度。
您可以尝试使用
cor
以及 rowSums
+ as.data.frame.table
,例如,
d <- cor(sapply(
unique(unlist(baskets)),
\(x) +(rowSums(baskets == x) > 0)
))
d[upper.tri(d, TRUE)] <- NA
na.omit(as.data.frame.table(d,responseName = "similarity"))
你将获得
Var1 Var2 similarity
2 apple orange 0.3333333
3 pear orange 0.3333333
4 kiwi orange -1.0000000
5 blueberry orange -0.5773503
8 pear apple -0.3333333
9 kiwi apple -0.3333333
10 blueberry apple -0.5773503
14 kiwi pear -0.3333333
15 blueberry pear -0.5773503
20 blueberry kiwi 0.5773503