2017-06-05 21 views
0

设定以3年平均水平跨越我有以下的数据帧,称为DF,面板中的数据为NAS

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年的平均数据。但是,如果在特定的三年间隔内只有两年的可用数据,我想忽略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) 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 

但我感兴趣的输出是:

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将工作。然后,我们按国家和Year_group进行总结。

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