Выберите группу с помощью dplyr, только для операции, без сохранения выбора - PullRequest
0 голосов
/ 17 сентября 2018

Я бы хотел выбрать часть данных с помощью dplyr для выполнения операции, но без сохранения выбора, для которого была выполнена операция.Моя база данных выглядит следующим образом:

   country country-year year     a     b
1  France  France2000   2000       NA    NA 
2  France  France2001   2001     1000  1000  
3  France  France2002   2002       NA    NA
4  France  France2003   2003     1600  2200
5  France  France2004   2004       NA    NA
6  UK          UK2000   2000     1000  1000  
7  UK          UK2001   2001       NA    NA
8  UK          UK2002   2002       NA    NA  
9  UK          UK2003   2003       NA    NA
10 UK          UK2004   2004       NA    NA
11 Germany     UK2000   2000       NA    NA 
12 Germany     UK2001   2001       NA    NA
13 Germany     UK2002   2002       NA    NA  
14 Germany     UK2003   2003       NA    NA
15 Germany     UK2004   2004       NA    NA

Как пример:

# I first select the group
df <- df %>% 
  group_by(country)%>% 

Для этой группы я хочу интерполировать (только интерполировать!), Когда есть более 1 наблюдения, ноЯ не хочу удалять группы, в которых есть только 1 или менее наблюдений.

Мне было интересно, могу ли я выбрать страны, в которых n>1 и только для этих групп выполнить операцию:

mutate_at(vars(a:b),~na.fill(.x,c(NA, "extend", NA))) 

Я также подумал о следующем, но не могу понять правильный синтаксис:

mutate_if(is.numeric,~if(n()>1  NA else na.fill(.x,c(NA, "extend", NA)))

Желаемый результат будет:

   country country-year year     a     b
1  France  France2000   2000       NA    NA 
2  France  France2001   2001     1000  1000  
3  France  France2002   2002  **1300****1600**  
4  France  France2003   2003     1600  2200
5  France  France2004   2004       NA    NA
6  UK          UK2000   2000     1000  1000  
7  UK          UK2001   2001       NA    NA
8  UK          UK2002   2002       NA    NA  
9  UK          UK2003   2003       NA    NA
10 UK          UK2004   2004       NA    NA
11 Germany     UK2000   2000       NA    NA 
12 Germany     UK2001   2001       NA    NA
13 Germany     UK2002   2002       NA    NA  
14 Germany     UK2003   2003       NA    NA
15 Germany     UK2004   2004       NA    NA

Есть предложения?

1 Ответ

0 голосов
/ 17 сентября 2018

Это должно работать:

df %>% 
  group_by(country)%>% 
  mutate_at(vars(a:b),
           ~as.numeric(if (sum(!is.na(.x))>1)
                       na.fill(.x,c(NA,"extend",NA))
                       else .x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...