使用R和dplyr进行总结 - 按组分组,计数,平均值,标准偏差

8

我对R和dplyr都比较新手。我的数据集只有两列:var1和var2。其中,var1包含数字值,而var2则包含3个级别的因子A、B和C。

        var1 var2
1  1.4395244    A
2  1.7698225    A
3  3.5587083    A
4  2.0705084    A
5  2.1292877    A
6  3.7150650    B
7  2.4609162    B
8  0.7349388    B
9  1.3131471    B
10 1.5543380    B
11 3.2240818    C
12 2.3598138    C
13 2.4007715    C
14 2.1106827    C
15 1.4441589    C

'data.frame':   15 obs. of  2 variables:
 $ var1: num  1.44 1.77 3.56 2.07 2.13 ...
 $ var2: Factor w/ 3 levels "A","B","C": 1 1 1 1 1 2 2 2 2 2 ...

我正在尝试使用dplyr对var2(A,B和C)进行分组,然后计数,并按平均值和标准差汇总var1。计数起作用了,但是我没有得到每个组的平均值和标准差,而是在每个组旁边获得了总体平均值和标准差。
为解决此问题,我进行了多次互联网搜索。所有结果似乎都提供与我正在使用的语法类似的语法。我还阅读了Stack Overflow在发布之前提供的所有推荐帖子。此外,我尝试重新启动R并确保我未使用plyr。
下面是我用于创建数据集和dplyr group_by / summarize的代码。
library(dplyr)
set.seed(123)
var1 <- rnorm(15, mean=2, sd=1)
var2 <- c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B",
          "C", "C", "C", "C", "C")
df <- data.frame(var1, var2)
df

df %>%
  group_by(df$var2) %>%
  summarize(
    count = n(),
    mean = mean(df$var1, na.rm = TRUE),
    sd = sd(df$var1, na.rm = TRUE)
  )

以下是结果:
# A tibble: 3 x 4
  `df$var2` count  mean    sd
  <fct>     <int> <dbl> <dbl>
1 A             5  2.15 0.845
2 B             5  2.15 0.845
3 C             5  2.15 0.845

计数似乎有效,每个组的计数都为5。但是每个组显示的是整列的总体均值和标准差,而非每个组的计数、均值和标准差。期望的结果是每个组的计数、均值和标准差。

我相信我肯定忽略了一些显而易见的东西,但我会非常感激任何帮助。


4
在使用 dplyr 时,引用列名时不要使用 $ 符号。下面是一个例子:对数据框 df 按变量 var2 分组,并计算每组的观测数、变量 var1 的均值和标准差。代码如下:df %>% group_by(var2) %>% summarize( count = n(), mean = mean(var1, na.rm = TRUE), sd = sd(var1, na.rm = TRUE) ) - Ronak Shah
2
你需要使用 group_by(var2), mean(var1)sd(var1),而不是 mean(df$var1), sd(df$var1)。第二种语法会给出整个列的值,而不是分组变量的值。 - neilfws
非常感谢!!!两种解决方案都很顺利。我非常感激你的帮助。我很感激。 - earlev4
1个回答

8

虽然已经通过评论回答了这个问题,但我觉得对于一个非常初步的问题来说,这样一个良好的可重现性示例值得得到官方回答。

library(dplyr)
set.seed(123)
var1 <- rnorm(15, mean=2, sd=1)
var2 <- c(rep("A", 5), rep("B", 5), rep("C", 5))
df <- data.frame(var1, var2) 
df_stat <- df %>% group_by(var2) %>% summarize(
                                      count = n(),
                                       mean = mean(var1, na.rm = TRUE), 
                                         sd = sd(var1, na.rm = TRUE)) 
head(df_stat)
# A tibble: 3 x 4
# var2   count  mean    sd
# <fct>  <int>  <dbl>  <dbl>
# 1 A      5    2.19   0.811
# 2 B      5    1.96   1.16 
# 3 C      5    2.31   0.639

非常感谢,dbo!!! 我非常感激官方答案。格式和结构非常好。 - earlev4
很高兴能帮忙,@earlev4。欢迎来到SO! - dbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接