1

R でいくつかの変数を使用した plyr周波数テーブルの威力を発見しました が、それがどのように機能するかを理解するのにまだ苦労しています。

値をハードコーディングせずに、頻度と要約統計を組み合わせることができるテーブル (データ フレーム) を作成したいと思います。

ここにデータセットの例があります

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))),
   )

前もって感謝します

4

2 に答える 2

2

ジョランのおかげです。あなたの関数を少し変更して、より一般的なものにしました(変数の位置を参照せずに)。

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")

そしてそれは動作します!!!

PS : (グループ) が何を表しているのかまだわかりませんが、

于 2012-08-09T19:18:37.800 に答える
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その機能を福音とみなさないでください。頭のてっぺんからそれを書きました。確かに改善/変更は可能ですが、少なくともそれは最初からのものです.

于 2012-08-09T18:46:00.807 に答える