频率按群组表示

时间:2016-08-09 13:39:49

标签: r mean

我想在 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()无效,因为我需要频率和平均频率。

3 个答案:

答案 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组NANaN仅有1次观察。

为了使这更通用,您可以用1:11或任何适当的替换as.numeric(colnames(df1))位。它&#39;很难说你有什么数据结构,也许是table

答案 2 :(得分:1)

我也想发布我的解决方案。

我做的是:

  1. data.frame()

    创建table()
    b1 <- data.frame(table(data$Group, as.numeric(data$Opinion)))
    
  2. 将数据从频率扩展到向量(否则R会一直显示如果我使用apply()会得到什么)

    b2 <- b[rep(row.names(b), b$Freq), 1:2]
    
  3. 使用了来自ddply()

    的循环
    b3 <- ddply(b2, .(Var1), summarize, mean = mean(as.numeric(Var2), na.rm = TRUE), sd = sd(Var2))