0

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)
4

1 に答える 1

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

説明

異なる年の 2 つのグループを取得するには、例 (2008-2010および2011) で、2 番目のグループの年、つまり を使用==して一致させることができます2011。結果は論理ベクトルになります。1次に、 2 つのグループが1とになるように、これに追加することで、これを数値インデックスに変換できます2。を追加する0と、TRUEは に変換され1、FALSE は となります02008-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
于 2014-11-08T15:56:27.227 に答える