我试过在SO上搜索一些帖子,但我不确定我在这里做错了什么,我想这个解决方案非常简单。我尝试按一个变量对数据帧进行分组,并计算该组中几个变量的平均值。
以下是我的尝试:
head(airquality)
target_vars = c("Ozone","Temp","Solar.R")
airquality %>% group_by(Month) %>% select(target_vars) %>% summarise(rowSums(.))
但我得到的错误是我的长度不匹配。我已尝试使用mutate
创建列或summarise_all
的变体,但这些似乎都不起作用。我需要组内的行和,然后计算组内的平均值(是的,它在这里是荒谬的)。
另外,我想使用select
,因为我试图仅针对某些变量执行此操作。
我确定这可能是重复的,但我找不到合适的。
编辑清晰度
对不起,我原来的问题不明确。想象一下,分组变量是日历月,我们有v1
,v2
和v3
。我想知道,在month
内,v1
,v2
和v3
的总和是多少。因此,如果我们有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
答案 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