2017-06-05 6 views
0

で設定したパネルデータにまたがっは、私は、データの3年間の平均を取るしたい、私はDFと呼ばれる次のデータフレームを、持っているのNA

Country Year Var1 Var2 
USA 2010 5 3 
USA 2011 6 5 
USA 2012 NA 8 
USA 2013 4 NA 
USA 2014 NA 6 
USA 2015 6 9 
CHN 2010 NA 5 
CHN 2011 7 NA 
CHN 2012 6 NA 
CHN 2013 4 4 
CHN 2014 NA 6 
CHN 2015 NA 8 
EGY 2010 3 NA 
EGY 2011 3 5 
EGY 2012 3 6 
EGY 2013 NA 8 
EGY 2014 NA NA 
EGY 2015 NA 2 

を3年間の平均を取ります。しかし、特定の3年の期間内に利用可能なデータが2年しかない場合は、NAを無視して2年間平均したいと考えています。同様に、データが特定の3年の期間内に1年間しか利用できない場合は、そのデータポイントをその3年間の期間の「平均」として保持する必要があります。基本的には、3年ごとに平均を取ってNAを無視したい。

私はで推奨されて、次の解決策試してみました:

Group.1 Group.2 Var1 Var2 
CHN [2010,2013) NA NA 
EGY [2010,2013) 3 NA 
USA [2010,2013) NA 5.333333 
CHN [2013,2016) NA 6.000000 
EGY [2013,2016) NA NA 
USA [2013,2016) NA NA 

しかし、私が興味を持っています出力は次のとおりです:それは次のように得られたR: Calculating 5 year averages in panel data

int<-cut(DF$Year,seq(2010,2016,by=3),right=F) 
id<-c("Var1", "Var2") 
ag<-aggregate(DF[id],list(DF$Country,int), mean) 

Group.1 Group.2 Var1 Var2 
CHN [2010,2013) 6.5 5 
EGY [2010,2013) 3 5.5 
USA [2010,2013) 5.5 5.3 
CHN [2013,2016) 4 6 
EGY [2013,2016) NA 5 
USA [2013,2016) 5 7.5 
+0

申し訳ありませんが、私は新しいです。これを無視してください。それは不完全です。 – user49017

+0

小さな再現可能な例と期待される出力を表示してください – akrun

+0

私は包括的な質問を削除して投稿しようとしています。削除が可能ですか? – user49017

答えて

0

ここですパッケージdplyrでそれをどうすることができますか?基本的には、mutateを使用して「年のグループ」を作成します。私はifelseを使用しましたが、それ以上のグループを持っているので、case_whenを見てください。ifelseが入れ子になっています。次に、国別と年度別に要約します。あなたは、ほとんど存在し

df1 <- read.table(text="Country Year Var1 Var2 
        USA 2010 5 3 
        USA 2011 6 5 
        USA 2012 NA 8 
        USA 2013 4 NA 
        USA 2014 NA 6 
        USA 2015 6 9 
        CHN 2010 NA 5 
        CHN 2011 7 NA 
        CHN 2012 6 NA 
        CHN 2013 4 4 
        CHN 2014 NA 6 
        CHN 2015 NA 8 
        EGY 2010 3 NA 
        EGY 2011 3 5 
        EGY 2012 3 6 
        EGY 2013 NA 8 
        EGY 2014 NA NA 
        EGY 2015 NA 2",header=TRUE, stringsAsFactors=FALSE) 
library(dplyr) 
df1%>% 
    group_by(Country)%>% 
    mutate(Year_group=ifelse(Year<2013,"2010-2012","2013-2016"))%>% 
    group_by(Country,Year_group)%>% 
    summarise(Mean_var1=mean(Var1,na.rm=TRUE),Mean_var2=mean(Var2,na.rm=TRUE) 

    Country Year_group Mean_var1 Mean_var2 
    <chr>  <chr>  <dbl>  <dbl> 
1  CHN 2010-2012  6.5 5.000000 
2  CHN 2013-2016  4.0 6.000000 
3  EGY 2010-2012  3.0 5.500000 
4  EGY 2013-2016  NaN 5.000000 
5  USA 2010-2012  5.5 5.333333 
6  USA 2013-2016  5.0 7.500000 
+0

ありがとう – user49017

0

、あなたのコードに一つだけ追加が必要です。

int <- cut(DF$Year, seq(2010, 2016, by = 3), right = FALSE) 
id <- c("Var1", "Var2") 
ag <- aggregate(DF[id], list(DF$Country, int), mean, na.rm = TRUE) 
#             | 
#----------------------------------------------------- 

ag 
# Group.1  Group.2 Var1  Var2 
#1  CHN [2010,2013) 6.5 5.000000 
#2  EGY [2010,2013) 3.0 5.500000 
#3  USA [2010,2013) 5.5 5.333333 
#4  CHN [2013,2016) 4.0 6.000000 
#5  EGY [2013,2016) NaN 5.000000 
#6  USA [2013,2016) 5.0 7.500000 

aggregate()さらに、引数に渡されたか、方法で使用を受け入れます。このようにしてna.rm = TRUEパラメータをmean()に渡すことができます。