2012-03-15 138 views
17

我有一個data.frame,我試圖創建一個頻率表,顯示每行的值的頻率。所以我開始是這樣的:將數據幀轉換爲特定格式的頻率表

d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5)) 

,看起來像這樣:

a b c 
    1 3 1 
    2 4 2 
    3 5 5 

什麼我真的想製作的是應急data.frame或矩陣,看起來像這樣:

1, 2, 3, 4, 5, 6, 7, 8, 9 
2, 0, 1, 0, 0, 0, 0, 0, 0 
0, 2, 0, 1, 0, 0, 0, 0, 0 
0, 0, 1, 0, 2, 0, 0, 0, 0 

頂行只是一個標籤行,不一定在最終結果中。但我在那裏添加它來說明。每行顯示數字1:9和每個數字在起始數據的每一行中顯示的次數。

我無法圍繞一個簡單的方式來創建這個頭。雖然它看起來像table()功能應該是有幫助的,但我無法讓它給我任何愛。任何幫助或想法表示讚賞。

+4

你有data.frame全數字的?你多快忘記了,蚱蜢......使用矩陣。 – 2012-03-16 00:46:13

+0

使用矩陣改變答案嗎? – 2012-03-16 13:04:08

+0

它不會改變Josh O'Brien的回答,因爲'apply'會自動將其第一個參數轉換爲矩陣/數組。我不確定伊利亞的。無論如何,我大多都在戲弄。 ;-) – 2012-03-16 14:45:20

回答

11

在這裏你去:

t(apply(d, 1, tabulate, nbin=9)) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 2 0 1 0 0 0 0 0 0 
[2,] 0 2 0 1 0 0 0 0 0 
[3,] 0 0 1 0 2 0 0 0 0 

(雖然它可能是在這個應用沒關係,tabulate()(所使用的代碼的內部爲table())也是與它進行令人印象深刻的速度不錯其計算)


編輯tabulate()沒有設置應對0或負整數。如果你想另外一個襯墊,做,你可以使用table()不過,做這樣的事情:

d <- data.frame(a=c(0,-1,-2), b=c(3,4,5), c=c(1,2,5)) 

t(apply(d, 1, function(X) table(c(X, -9:9)) - 1)) 
    -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 
[1,] 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 
[2,] 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 
[3,] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 
+0

絕對(另一個)基地R的簡單寶石之一。再次感謝R核心! – 2012-03-15 21:15:12

+0

任何方式使它容納零和負值?在檢查我的用例時,那些比我在做簡單問題時意識到的更重要。 – 2012-03-15 21:33:11

+1

@JDLong - 我添加了一個使用'table()'的單行程,可以優雅地處理零和負整數。您只需要調整'-9:9'位以覆蓋您感興趣的範圍,並且該範圍之外的任何數字仍將包含在表格中。通過添加一些初始行來檢查原始data.frame中整數的範圍,並在輸出表中設置範圍,您可以輕鬆地將其包含到一個很好的小函數中,以執行您想要的操作。乾杯。 – 2012-03-15 21:53:40

8

另一種解決方案採用表

library(reshape) 
d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5)) 
d2 <- melt(d) 
d2$rows <- rep(1:nrow(d), ncol(d)) 
table(d2$rows, d2$value) 
+0

這有一個明顯的優勢,正確處理零和負值,這是我的問題。非常好! – 2012-03-15 21:13:16

相關問題