R 各组的平均值和标准差

R 各组的平均值和标准差,r,R,我有这样一个数据框: 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 我想计算obs 1到4在obs5条件下的平均值和标准偏差,并将其放在表格格式中。无论obs5是“0”还是“1”,各列标题应为平均值和标准偏

我有这样一个数据框:

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
我想计算obs 1到4在obs5条件下的平均值和标准偏差,并将其放在表格格式中。无论obs5是“0”还是“1”,各列标题应为平均值和标准偏差。因此,在这种情况下,表格将为4×4类型

我试过了

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

表有点冗长,但输出格式正确:

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

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

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)

我们可以使用
data.table
。我们将“data.frame”转换为“data.table”(
setDT(df1)
),将其从“宽”格式重塑为“长”格式,然后使用
dcast
将其重塑为“宽”格式。来自
data.table的
dcast
可以进行多个
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
library(data.table)#v1.9.6+
DT
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