代码之家  ›  专栏  ›  技术社区  ›  user1043144

将频率和汇总统计数据合并在一个表中?

  •  1
  • user1043144  · 技术社区  · 12 年前

    我刚刚发现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))),
       )
    

    提前感谢

    2 回复  |  直到 12 年前
        1
  •  2
  •   joran    12 年前

    下面是一个让您开始学习的示例:

    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
  •  2
  •   user1043144    12 年前

    感谢Joran。 我稍微修改了你的函数,使其更通用(没有参考变量的位置)。

    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:我仍然不明白(团体)代表什么,但是