2017-02-19 3 views
0

나는 다음과 같은 데이터가 있습니다. 예를 들어, 위의 예에서 가장 비슷한 3 가지 조합이 상위 3 쌍을 반환하고 싶습니다. John & Anna, John & Dave, John & 스튜.찾기 주파수 R

은 내가

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입니까? 왜 3이 아닙니까? – 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으로 설정할 수 있습니다. –

+0

감사합니다 @KarthikArumugham, 답변에 추가했습니다. –

1

이 당신을 위해 무엇을 요구에 좀 더 가까이 할 것, 그리고 @의 데시벨의 대답에서 "안양"사용하여 기본 R.에서만 기능을 사용

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 

NA 사용을 diaglower.tri에 대해 우리가 관심이없는 값을 쉽게 제거 할 수 있습니다.