Среднее значение за 3 года в наборе панельных данных с НА

У меня есть следующий фрейм данных, называемый 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 и взять среднее значение за два года. Точно так же, если данные доступны только за один год в пределах определенного трехлетнего интервала, я хочу сохранить эту точку данных как «среднее значение» для этого трехлетнего интервала. По сути, в пределах каждого трехлетнего интервала я хочу брать среднее значение, игнорируя НП.

Я пробовал следующее решение, рекомендованное в: R: Расчет средних значений за 5 лет в данные панели

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

person user49017    schedule 05.06.2017    source источник
comment
Извини, я новенький. Не обращай на это внимания. Это неполно.   -  person user49017    schedule 05.06.2017
comment
Покажите небольшой воспроизводимый пример и ожидаемый результат   -  person akrun    schedule 05.06.2017
comment
Я пытаюсь удалить и разместить исчерпывающий вопрос. Возможно ли удаление?   -  person user49017    schedule 05.06.2017
comment
Да, вы можете удалить или отредактировать сообщение и изменить его   -  person akrun    schedule 05.06.2017
comment
или отредактируйте свое сообщение, сделав его правильным вопросом   -  person Suraj Rao    schedule 05.06.2017


Ответы (2)


Вот как это можно сделать с помощью пакета 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
person Pierre Lapointe    schedule 05.06.2017

Вы почти у цели, требуется только одно дополнение к вашему коду:

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

person Uwe    schedule 05.06.2017