2012-10-23 147 views
1

我有這樣的情況:
DF頻率計數

List  Count 
R472  1 
R472  1 
R472  2 
R472  2  
R845  1 
R845  2 
R845  2 
....  ... 

我想下面的輸出:

DF

List   freq_of_number1 freq_of_number2 
R472     2     2 
R845     1     2 
.... 

任何想法? Thnks。

回答

4

這是aggregate工作:

d <- read.table(text="List  Count 
R472  1 
R472  1 
R472  2 
R472  2  
R845  1 
R845  2 
R845  2", header=TRUE) 

aggregate(Count ~ List, data=d, FUN=table) 

# List Count.1 Count.2 
# 1 R472  2  2 
# 2 R845  1  2 

編輯:

上面的代碼在你提供的情況下,因爲你已經接受了答案,我認爲它的工作原理爲您較大的情況下同樣,但如果List中的任何條目缺少Count中的某個數字,則此簡單答案將會失敗。對於更一般的情況:

DF <- read.table(text="List  Count 
R472  1 
R472  1 
R472  2 
R472  2  
R845  1 
R845  2 
R845  2 
R999  2", header=TRUE) 

f <- function(x) { 
    absent <- setdiff(unique(DF$Count), x) 
    ab.count <- NULL 
    if (length(absent) > 0) { 
     ab.count <- rep(0, length(absent)) 
     names(ab.count) <- absent 
    } 
    result <- c(table(x), ab.count) 
    result[order(names(result))] 
} 
aggregate(Count ~ List, data=d, FUN=f) 

# List Count.1 Count.2 
# 1 R472  2  2 
# 2 R845  1  2 
# 3 R999  0  1 

編輯2:

剛看到@ JasonMorgan的答案。去接受那個。

+0

很好的解決方案:d +1 –

+0

mplourde嗨!再次感謝! – Bnf8

2

我認爲有一種更有效的方式來做到這一點,但這裏有一個想法

DF <- read.table(text='List  Count 
R472  1 
R472  1 
R472  2 
R472  2  
R845  1 
R845  2 
R845  2', header=TRUE) 



Freq <- lapply(split(DF, DF$Count), function(x) aggregate(.~ List, data=x, table)) 
counts <- do.call(cbind, Freq)[, -3] 
colnames(counts) <- c('List', 'freq_of_number1', 'freq_of_number2') 
counts 
List freq_of_number1 freq_of_number2 
1 R472    2    2 
2 R845    1    2 
3

table功能不起作用?

> with(DF, table(List, Count)) 
     Count 
List 1 2 
    R472 2 2 
    R845 1 2 

更新:每布蘭登的評論,這也能發揮作用,如果你不喜歡使用with

> table(DF$List, DF$Count) 
+0

+1這是正確的方法 –

+1

'table()'是你所需要的。 '與'是不必要的。 –