【问题标题】:Mean and standard deviation by groups各组的平均值和标准差
【发布时间】:2016-03-11 14:39:00
【问题描述】:

我有一个类似这样的数据框:

obs1 obs2 obs3 obs4 obs5
4     6    7     3    0
7     2    4     5    0
2     5    7     8    1
5     8    6     9    1
6     0    3     6    1
7     1    2     4    1

我想以 obs5 为条件计算 obs 1 到 4 的均值和标准差,并将其以表格格式表示。列标题应该是每个 obs5 是“0”还是“1”的平均值和标准差。因此,在这种情况下,表格将是 4 x 4 类型。

我试过了

table <- aggregate( .~ obs5, DF, function(x) c(mean = mean(x), sd = sd(x)))

我不确定如何进一步获得正确的格式。

【问题讨论】:

    标签: r


    【解决方案1】:

    有点啰嗦,但输出格式正确:

    DF <- data.frame(obs1 = c(4, 7, 2, 5, 6, 7), obs2 = c(6, 2, 5, 8, 0, 1), obs3 = c(7, 4, 7, 6, 3, 2), obs4 = c(3, 5, 8, 9, 6, 4), obs5 = c(0, 0, 1, 1, 1, 1))
    
    res <- by(DF[, -5], DF$obs5, FUN = function(x) rbind(colMeans(x), sqrt(diag(var(x)))))
    res <- do.call(rbind, res)
    rownames(res) <- paste(rep(c('mean', 'sd'), 2), rep(c(0, 1), c(2, 2)), sep = ".")
    t(res)
    
    #     mean.0     sd.0 mean.1     sd.1
    #obs1    5.5 2.121320   5.00 2.160247
    #obs2    4.0 2.828427   3.50 3.696846
    #obs3    5.5 2.121320   4.50 2.380476
    #obs4    4.0 1.414214   6.75 2.217356
    

    【讨论】:

      【解决方案2】:

      您可以分别计算均值和标准差,然后将结果组合在一起:

      means <- aggregate( .~ obs5, DF, mean)
      rownames(means) <- paste("mean", means$obs5)
      sds <- aggregate( .~ obs5, DF, sd)
      rownames(sds) <- paste("sd", means$obs5)
      
      tab <- rbind(means, sds)
      tab <- tab[, -1]
      tab <- t(tab)
      

      结果:

           mean 0 mean 1     sd 0     sd 1
      obs1    5.5   5.00 2.121320 2.160247
      obs2    4.0   3.50 2.828427 3.696846
      obs3    5.5   4.50 2.121320 2.380476
      obs4    4.0   6.75 1.414214 2.217356
      

      【讨论】:

        【解决方案3】:

        我们可以使用data.table。我们将“data.frame”转换为“data.table”(setDT(df1)),将其从“宽”格式重塑为“长”格式,然后使用dcast 将其重塑回“宽”格式。来自data.tabledcast 可以带多个fun.aggregate

        library(data.table)#v1.9.6+
        DT <- melt(setDT(df1), id.var='obs5', variable.name='Obs')
        dcast(DT, Obs~obs5, value.var='value', fun.aggregate=c(mean, sd))
        
        #    Obs value_mean_0 value_mean_1 value_sd_0 value_sd_1
        #1: obs1          5.5         5.00   2.121320   2.160247
        #2: obs2          4.0         3.50   2.828427   3.696846
        #3: obs3          5.5         4.50   2.121320   2.380476
        #4: obs4          4.0         6.75   1.414214   2.217356
        

        【讨论】:

          猜你喜欢
          • 2020-12-26
          • 1970-01-01
          • 2014-03-21
          • 1970-01-01
          • 1970-01-01
          • 2018-01-21
          • 1970-01-01
          相关资源
          最近更新 更多