簡體   English   中英

在數據集中查找對的頻率-R

[英]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

diaglower.tri使用NA可以使我們輕松刪除不感興趣的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM