r:在group_by之后汇总rowSums

时间:2017-10-23 14:40:59

标签: r dplyr

我试过在SO上搜索一些帖子,但我不确定我在这里做错了什么,我想这个解决方案非常简单。我尝试按一个变量对数据帧进行分组,并计算该组中几个变量的平均值。

以下是我的尝试:

head(airquality)
target_vars = c("Ozone","Temp","Solar.R")
airquality %>% group_by(Month) %>% select(target_vars) %>% summarise(rowSums(.))

但我得到的错误是我的长度不匹配。我已尝试使用mutate创建列或summarise_all的变体,但这些似乎都不起作用。我需要组内的行和,然后计算组内的平均值(是的,它在这里是荒谬的)。

另外,我想使用select,因为我试图仅针对某些变量执行此操作。

我确定这可能是重复的,但我找不到合适的。

编辑清晰度 对不起,我原来的问题不明确。想象一下,分组变量是日历月,我们有v1v2v3。我想知道,在month内,v1v2v3的总和是多少。因此,如果我们有12个月,结果将是12x1数据帧。这是一个例子,如果我们只有一个月:

Month v1 v2 v3 Sum 
1      1  1  0   2
1      1  1  1   3
1      1  0  0   3

然后结果将是:

Month  Average
1           8/3

3 个答案:

答案 0 :(得分:2)

这似乎可以满足您的需求。它是常规的R. sapply函数将月份用“名称”分隔。应用于每个数据框的sum函数不会将列总和分开。 (更正#2:仅使用target_vars):

sapply( split( airquality[target_vars], airquality$Month), sum, na.rm=TRUE)
    5     6     7     8     9 
 7541  8343 10849  8974  8242 

如果您想要每个变量结果的数量,那么您将除以变量的数量:

sapply( split( airquality[target_vars], airquality$Month), sum, na.rm=TRUE)/
                                                           (length(target_vars))
       5        6        7        8        9 
2513.667 2781.000 3616.333 2991.333 2747.333 

答案 1 :(得分:2)

您可以尝试:

library(tidyverse)
airquality %>% 
  select(Month, target_vars) %>% 
  gather(key, value, -Month) %>% 
  group_by(Month) %>%
  summarise(n=length(unique(key)),
            Sum=sum(value, na.rm = T)) %>% 
  mutate(Average=Sum/n)
# A tibble: 5 x 4
  Month     n   Sum  Average
  <int> <int> <int>    <dbl>
1     5     3  7541 2513.667
2     6     3  8343 2781.000
3     7     3 10849 3616.333
4     8     3  8974 2991.333
5     9     3  8242 2747.333

我们的想法是使用tidyr::gather()将数据从宽转换为长,然后按Month进行分组,并计算总和和平均值。

答案 2 :(得分:1)

也许这就是你要找的东西

library(dplyr)
library(purrr)
library(tidyr)   # forgot this in original post
airquality %>%
  group_by(Month) %>% 
  nest(Ozone, Temp, Solar.R, .key=newcol) %>%
  mutate(newcol = map_dbl(newcol, ~mean(rowSums(.x, na.rm=TRUE))))

# A tibble: 5 x 2
  # Month   newcol
  # <int>    <dbl>
# 1     5 243.2581
# 2     6 278.1000
# 3     7 349.9677
# 4     8 289.4839
# 5     9 274.7333  

我从来没有遇到过所有答案都不一致的情况。这是第5个月的一些验证(至少我认为)

airquality %>%
  filter(Month == 5) %>%
  select(Ozone, Temp, Solar.R) %>%
  mutate(newcol = rowSums(., na.rm=TRUE)) %>%
  summarise(sum5 = sum(newcol), mean5 = mean(newcol))

#   sum5    mean5
# 1 7541 243.2581