2015-11-09 110 views
1

我試圖使用R中庫plyrcount函數來計算出現的特定數字組合的頻率。使用plyr計數頻率

例如,我想知道1號和2號一起出現的頻率。

N1 N2 N3 
1 1 2 5 
2 2 1 4  
3 2 4 3 
4 3 1 2  
5 2 3 1 
6 3 1 4 

因此,對於像上面的一個數據幀,我不得不列1和第2列,列1和3列2和3相結合,併合並他們。然後我爲合併的數據幀執行「計數」。

combined1_2 = cbind(df$N1,df$N2) 
combined1_3 = cbind(df$N1,df$N3) 
combined2_3 = cbind(df$N2,df$N3) 

combined_all = rbind(freq1_2,freq1_3,freq2_3) 
combined_freq = count(combined_all) 

所以當我檢查頻率表時,我得到了以下結果(只顯示了部分結果)。

x1 x2 Freq 
1 1 2  2 
2 2 1  2 

問題是計數函數處理的數字「1和2」不同於「2和1」。所以我想知道在R中是否有任何功能可以解決這個問題,併產生如下所示的正確結果。

x1 x2 Freq 
1 1 2  4 

回答

1

你可以只算次數爲成一排:

sum(apply(df, 1, function(x){all(c(1, 2) %in% x)})) 
#[1] 4 
+0

感謝您的解決方案!它節省了必須組合每個列的過程。我想知道是否有一種簡單的方法可以寫出1到40之間的任意兩個數字之間的所有組合。或者使用循環來替換c(1,2)部分到c(i,i + n)的唯一解決方案, ? – 1stclassmelon

+0

@ 1stclassmelon不客氣:-)。或許用'combn'來解答你的第二個問題? – Cath

3

你也可以向量化這個如果沒有太多的數字僅通過檢查,如果df等於每個檢查的號碼

sum((rowSums(df == 1) > 0) & (rowSums(df == 2) > 0)) 
## [1] 4 
+0

感謝您的幫助。這真的簡化了這個過程。還有一個問題:對於較大的數據,如果我想在40個不同的數字中找到組合頻率,我想我將不得不使用一個循環? – 1stclassmelon

+1

如果你有40個不同的數字,使用Caths方法,它會更簡單 –