Суммируйте данные по подмножеству переменных группировки
Я бы тоже хотел суммировать один столбец за другим, что я знаю, как это сделать, используя ddply или aggregate... Но я хочу также добавить группы в мою переменную группировки для суммирования данных в произвольном порядке, см. Ниже:
##Create Data
year<-c(2008,2008,2008,2008,2009,2009,2009,2010,2010,2010,2010,2011,2011,2011,2011,2011)
catch<-c(1,2,0,1,1,0,1,0,1,2,1,0,1,1,1,0)
df<-data.frame(year,catch)
##I know how to aggregate by year:
yearlyAVcap<-ddply(df,~year,summarise,mean=mean(catch),sd=sd(catch))
##But I'd like to have 2008,2009,2010 summarized together and 2011 on it's own (i,e two groups- 1=2008,2009,2010 ; 2=2011)
1 ответ
Вы могли бы попробовать
df1 <- transform(df, yrGroup=c('2008-2010', '2011')[(year==2011)+1])
library(plyr)
ddply(df1, .(yrGroup), summarise, mean=mean(catch), sd=sd(catch))
# yrGroup mean sd
#1 2008-2010 0.9090909 0.7006490
#2 2011 0.6000000 0.5477226
Или используя dplyr
df1 %>%
group_by(yrGroup) %>%
summarise_each(funs(mean, sd), catch)
#summarise_each can be used for multiple columns
# yrGroup mean sd
#1 2008-2010 0.9090909 0.7006490
#2 2011 0.6000000 0.5477226
объяснение
Чтобы получить две группы из разных лет, в примере (2008-2010
а также 2011
), мы можем использовать ==
для второго года группы, т.е. 2011
, Результатом будет логический вектор. Затем мы можем преобразовать это в числовой индекс, добавив 1
чтобы две группы 1
а также 2
, Если мы добавим 0
, TRUE
будет преобразован в 1
и ЛОЖЬ как 0
, Этот числовой индекс можно использовать для его переименования в 2008-2010
а также 2011
,
df$year==2011
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
#[13] TRUE TRUE TRUE TRUE
(df$year==2011)+1
#[1] 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
c('2008-2010', '2011')[(df$year==2011)+1]
#[1] "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2008-2010"
#[7] "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2011"
#[13] "2011" "2011" "2011" "2011"
Предположим, у нас есть несколько лет, например 2008-2010
как одна группа и 2011-2013
как другая группа, мы можем использовать %in%
(df$year %in% 2011:2013)+1