[英]Finding frequency of pairs within a dataset - R
我有以下數據:
Name Event
John EventA
Anna EventA
Dave EventA
Stew EventB
John EventB
Anna EventB
John EventC
Stew EventC
Dave EventC
我想找出誰做最多的相同活動。 因此,例如在上面的示例中,我希望它返回最相似的前三對:John&Anna,John&Dave,John&Stew。
我認為我需要制作一個頻率矩陣,如下所示
Name John Anna Dave Stew
John 0 2 2 2
Anna 2 0 1 1
Dave 2 1 0 1
Stew 2 1 1 0
然后將其轉換為如下所示:
Pair Frequency
John Anna 2
John Dave 2
John Stew 2
Anna Dave 1
Anna Stew 1
Dave Stew 1
但是我不知道該怎么做。
我正在使用R,所以如果有人知道這樣做的方法,那將是巨大的幫助!
您可以使用reshape2
包的基礎和melt
table
。
#DATA
df = structure(list(Name = c("John", "Anna", "Dave", "Stew", "John",
"Anna", "John", "Stew", "Dave"), Event = c("EventA", "EventA",
"EventA", "EventB", "EventB", "EventB", "EventC", "EventC", "EventC"
)), .Names = c("Name", "Event"), row.names = c(NA, -9L), class = "data.frame")
#Get Pairwise Frequency
a = table(df) %*% t(table(df))
a
# Name
#Name Anna Dave John Stew
# Anna 2 1 2 1
# Dave 1 2 2 1
# John 2 2 3 2
# Stew 1 1 2 2
#If you want, set diagonal elements to zero (From Karthik's comment)
#diag(a) <- 0
library(reshape2)
output = data.frame(melt(a))
colnames(output) = c("Name1", "Name2", "Value")
#Remove the pair with oneself
output = output[-(which(output$Name1 == output$Name2)),]
output
# Name1 Name2 Value
#2 Dave Anna 1
#3 John Anna 2
#4 Stew Anna 1
#5 Anna Dave 1
#7 John Dave 2
#8 Stew Dave 1
#9 Anna John 2
#10 Dave John 2
#12 Stew John 2
#13 Anna Stew 1
#14 Dave Stew 1
#15 John Stew 2
#YOU CAN PASTE 'NAME1' and 'NAME2' to a 'PAIR' if necessary
#output$PAIR = apply(output, 1, function(x) paste(sort(x[1:2]), collapse = " "))
這似乎更接近您的要求,並且僅在base R中使用函數。使用@db答案中的“ df”:
x <- as.table(tcrossprod(table(df)))
x[lower.tri(x, diag = TRUE)] <- NA
na.omit(data.frame(x))
# Name Name.1 Freq
# 5 Anna Dave 1
# 9 Anna John 2
# 10 Dave John 2
# 13 Anna Stew 1
# 14 Dave Stew 1
# 15 John Stew 2
對diag
和lower.tri
使用NA
可以使我們輕松刪除不感興趣的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.