在具有 NA 的面板数据集中取 3 年平均值
Taking a 3 year average across in a panel data set with NAs
我有以下数据框,称为 DF,
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 并取两年平均值。同样,如果在特定的三年间隔内只有一年的数据可用,我想将该数据点保留为该三年间隔的 "average"。基本上,在每三年的时间间隔内,我想取平均值,而忽略 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
以下是使用包 dplyr
执行此操作的方法。基本上,您首先使用 mutate
创建一个 "year group"。我使用 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
您快完成了,只需要在您的代码中添加一项:
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()
.
我有以下数据框,称为 DF,
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 并取两年平均值。同样,如果在特定的三年间隔内只有一年的数据可用,我想将该数据点保留为该三年间隔的 "average"。基本上,在每三年的时间间隔内,我想取平均值,而忽略 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
以下是使用包 dplyr
执行此操作的方法。基本上,您首先使用 mutate
创建一个 "year group"。我使用 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
您快完成了,只需要在您的代码中添加一项:
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()
.