我想在 R 中按组计算频率的均值和sd。这是我的数据:
Opinion 1 2 3 4 5 6 7 8 9 10 11
Group
A 0 1 1 0 3 15 8 9 12 5 3
B 1 3 5 8 15 18 17 14 15 9 4
C 8 4 15 19 14 25 17 16 20 4 6
D 0 0 0 0 0 0 1 0 0 0 0
E 0 6 5 8 12 14 15 15 14 7 8
F 1 0 0 0 1 1 0 1 1 0 0
G 3 0 4 4 1 1 1 1 1 0 1
我想要计算的是每组(A,B,C,D,F,G)的均值和sd。每个细胞都是频率。特别是,每个“意见”都从受访者那里得到了许多答案。例如,作为A组支持者的受访者平均回答意见7.5和sd 1.9。
我用手计算每个组的均值和sd。如何编写一个可以一次计算出来的循环?我相信这里有人已经知道了。我将衷心感谢您的帮助。谢谢。
P.S。 apply()
无效,因为我需要频率和平均频率。
答案 0 :(得分:1)
要计算每组的平均值,您可以使用以下代码:
the_means <- setNames(rowSums(col(df1)*df1) / rowSums(df1),
LETTERS[seq_len(nrow(df1))])
#> the_means
# A B C D E F G
#7.526316 6.761468 6.013514 7.000000 6.846154 5.800000 4.529412
数据:强>
df1 <- structure(list(V1 = c(0L, 1L, 8L, 0L, 0L, 1L, 3L), V2 = c(1L, 3L,
4L, 0L, 6L, 0L, 0L), V3 = c(1L, 5L, 15L, 0L, 5L, 0L, 4L), V4 = c(0L, 8L,
19L, 0L, 8L, 0L, 4L), V5 = c(3L, 15L, 14L, 0L, 12L, 1L, 1L), V6 = c(15L,
18L, 25L, 0L, 14L, 1L, 1L), V7 = c(8L, 17L, 17L, 1L, 15L, 0L, 1L),
V8 = c(9L, 14L, 16L, 0L, 15L, 1L, 1L), V9 = c(12L, 15L, 20L, 0L, 14L, 1L,
1L), V10 = c(5L, 9L, 4L, 0L, 7L, 0L, 0L), V11 = c(3L, 4L, 6L, 0L, 8L, 0L,
1L)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9",
"V10", "V11"), class = "data.frame", row.names = c(NA, -7L))
答案 1 :(得分:1)
对于手段(使用@ RHertel&#39; s可爱,可重现的数据)
apply(df1, 1, function(x) weighted.mean(1:11, w = x))
# [1] 7.526316 6.761468 6.013514 7.000000 6.846154 5.800000 4.529412
对于标准偏差:
apply(df1, 1, function(x) sqrt(weighted.mean((1:11)^2, w = x) - weighted.mean(1:11, w = x)^2))
# [1] 1.883495 2.254045 2.552123 0.000000 2.448584 2.785678 2.767833
我们使用定义Var(X) = E(X^2) - E(X)^2
,并将其平方根作为标准偏差。如果您想要样本标准差,可以乘以sqrt(rowSums(df1) / (rowSums(df1) - 1))
。当然,这将导致D组NA
或NaN
仅有1次观察。
为了使这更通用,您可以用1:11
或任何适当的替换as.numeric(colnames(df1))
位。它&#39;很难说你有什么数据结构,也许是table
?
答案 2 :(得分:1)
我也想发布我的解决方案。
我做的是:
从data.frame()
table()
b1 <- data.frame(table(data$Group, as.numeric(data$Opinion)))
将数据从频率扩展到向量(否则R会一直显示如果我使用apply()
会得到什么)
b2 <- b[rep(row.names(b), b$Freq), 1:2]
使用了来自ddply()
b3 <- ddply(b2, .(Var1), summarize, mean = mean(as.numeric(Var2), na.rm = TRUE), sd = sd(Var2))