2013-07-16 157 views
1

我有以下代碼,它可以做我想做的事。但我想知道是否有更簡單/更好的方式到達那裏?計算平均次數的函數

我這樣做的總體目標是我爲整體數據建立一個單獨的彙總表,因此從中得出的平均值將進入該彙總。

Test <- data.frame(
    ID = c(1,1,1,2,2,2,3,3,3), 
    Thing = c("Apple","Apple","Pear","Pear","Apple","Apple","Kiwi","Apple","Pear"), 
    Day = c("Mon","Tue","Wed") 
) 

countfruit <- function(data){ 
df <- as.data.frame(table(data$ID,data$Thing)) 

df <- dcast(df, Var1 ~ Var2) 
    colnames(df) = c("ID", "Apple","Kiwi", "Pear") 

    #fixing the counts to apply a 1 for if there is any count there: 
    df$Apple[df$Apple>0] = 1 
    df$Kiwi[df$Kiwi>0] = 1 
    df$Pear[df$Pear>0] = 1 

    #making a new column in the summary table of how many for each person 
    df$number <- rowSums(df[2:4]) 

return(mean(df$number))} 

result <- countfruit(Test) 
+0

我很抱歉,我沒有完全得到你想要得到的代碼是什麼,可以擴大一點嗎? – nico

回答

1

我認爲你的問題複雜化了,這裏的小版本保持相同的原理。

df <- table(data$ID,data$Thing) 
mean(rowSums(df>0)) ## mean of non zero by column 

編輯一個線性解決方案:

with(Test , mean(rowSums(table(ID,Thing)>0))) 
+0

太棒了!是的,我有一種感覺我太過於複雜,因此我想我會問:)謝謝。你有什麼機會可以解釋'與'有什麼關係?我在幫助文件中看了一下,但是不能解密它:( – Froom2

+0

'with'在由數據構建的環境中評估R表達式,可能會修改原始數據。因此,在'with(Test,...)'內data.frame測試成爲一個環境,所以不需要使用$來訪問變量,ID也不需要測試$ ID,通過幫助,去試試例子,別無他法。 – agstudy

0

它看起來像你試圖計算每列有多少個非零項。如果是這樣,請使用as.logical,它可以將任意非零數字轉換爲TRUE(又名1),或者只計算一行中零的數量並從相關列的數量中減去。 例如,如果我正確地按照你的代碼,你的數據幀是

Var1 Apple Kiwi Pear 
1 1  2 0 1 
2 2  2 0 1 
3 3  1 1 1 

所以,(ncol(df)-1) - length(df[1,]==0)給你的第一行計數。 或者,使用as.logical將所有非零值轉換爲TRUE又名1並計算感興趣的列上的rowSums

+0

這也不錯,但從agstudy的單行是理想的:) – Froom2

+0

@ Froom2我同意你/你。我決定編寫一個迷你教程,介紹如何在'R'中做些事情。 agstudy肯定已經寫出了一個乾淨的解決方案。 –