2012-08-09 102 views
1

我剛剛發現了plyr frequency table with several variables in R 的威力,我仍然在努力瞭解它是如何工作的,我希望這裏有人能幫助我。在一張表中合併頻率和彙總統計數據?

我想創建一個表格(數據框架),我可以在其中組合頻率和彙總統計信息,但不需要對這些值進行硬編碼。

下面的示例數據集

require(datasets) 

d1 <- sleep 
# I classify the variable extra to calculate the frequencies 
extraClassified <- cut(d1$extra, breaks = 3, labels = c('low', 'medium', 'high')) 
d1 <- data.frame(d1, extraClassified) 

我要找應該是一個結果:

require(plyr) 

    ddply(d1, "group", summarise, 
    All = length(ID), 

    nLow = sum(extraClassified == "low"), 
    nMedium = sum(extraClassified == "medium"),  
    nHigh = sum(extraClassified == "high"), 

    PctLow  = round(sum(extraClassified == "low")/ length(ID), digits = 1), 
    PctMedium = round(sum(extraClassified == "medium")/ length(ID), digits = 1),  
    PctHigh = round(sum(extraClassified == "high")/ length(ID), digits = 1), 

    xmean = round(mean(extra), digits = 1), 
    xsd = round(sd(extra), digits = 1)) 

我的問題:我怎麼能做到這一點沒有硬編碼值是多少?

對於記錄: 我嘗試這樣的代碼,但它並沒有提前上班

ddply (d1, "group", 
    function(i) c(table(i$extraClassified),  
    prop.table(as.character(i$extraClassified))), 
    ) 

感謝

+0

爲什麼不直接編寫自己的函數,而是使用'summarise'? – joran 2012-08-09 18:18:48

+0

謝謝喬蘭。事實是:我不知道這個功能如何看起來像。我嘗試了幾個想法來使用表函數無濟於事。僅供參考:我使用的數據有幾個因素。 – user1043144 2012-08-09 18:32:10

回答

2

下面是一個例子,讓你開始:

foo <- function(x,colfac,colval){ 
    tbl <- table(x[,colfac]) 
    res <- cbind(n = nrow(x),t(tbl),t(prop.table(tbl))) 
    colnames(res)[5:7] <- paste(colnames(res)[5:7],"Pct",sep = "") 
    res <- as.data.frame(res) 
    res$mn <- mean(x[,colval]) 
    res$sd <- sd(x[,colval]) 
    res 
} 

ddply(d1,.(group),foo,colfac = "extraClassified",colval = "extra") 

別不要把那個功能foo當做福音。我只是把它寫在我頭頂。當然可以進行改進/修改,但至少可以從頭開始。

2

感謝喬蘭。 我slighlty修改你的函數,使其更通用(不參考變量的位置)。

require(plyr) 
      foo <- function(x,colfac,colval) 
      { 

       # table with frequencies 
       tbl <- table(x[,colfac]) 
       # table with percentages 
       tblpct <- t(prop.table(tbl)) 
       colnames(tblpct) <- paste(colnames(t(tbl)), 'Pct', sep = '') 

       # put the first part together 
       res <- cbind(n = nrow(x), t(tbl), tblpct) 
       res <- as.data.frame(res) 

       # add summary statistics 

       res$mn <- mean(x[,colval]) 
       res$sd <- sd(x[,colval]) 
       res 
      } 

ddply(d1,.(group),foo,colfac = "extraClassified",colval = "extra") 

它工作!

P.S:我還是不明白什麼(組)代表,但