- R

2017-02-19 1 views
0

を、私は、次のデータがあります。- R

Name Event 

John EventA 
Anna EventA 
Dave EventA 
Stew EventB 
John EventB 
Anna EventB 
John EventC 
Stew EventC 
Dave EventC 

を私はほとんど同じイベントを行う人を見つけるしたいと思います。たとえば、上記の例では、最も類似している上位3つのペアがトップ3になることを返したいと思います。

私は

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と協力しています。誰かがこれを行う方法を知っていれば、大きな助けになるでしょう!

+0

最初の表では、なぜJohn-Johnのエントリが0ですか? – G5W

+0

私は他のペアの頻度にしか興味がありません。だからジョンジョンは3になるだろうが、私はペアのリストには入れたくない。 – Mark

答えて

2

ベースのtablemeltreshape2パッケージを使用できます。

#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 = " ")) 
+1

'diag(a)< - 0'は対角要素をゼロに設定できます。 –

+0

ありがとう@KarthikArumugham、私は答えに追加しました –

1

これは、あなたが求めているものに少し近いように思える、とDBの答え@から「DF」を使用して、ベースR.でのみ機能を使用しています:

NAを使用して
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については、私たちが興味のない値を簡単に削除することができます。