Как выбрать значения, отличные от NA, по группам, если только NAs

#r #dplyr

#r #dplyr

Вопрос:

Я хочу выбрать значения, отличные от NA, по идентификатору и по году для обеих переменных v1 и v2 (в моем фактическом наборе данных имеется более двух переменных, таких как v1 и v2), если только нет только NAs.

Я также хочу настроить его так, чтобы, если значения по идентификатору и году конфликтуют, я выбирал последнюю строку.

 > id<- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 5,5)
> year<-c(2014, 2014, 2019, 2014, 2014, 2014, 2020, 2018, 2018, 2017, 2018, 2019, 2019)
> v1<- c("a", NA, NA, NA, "b", "a", "b", NA, NA, "c", NA, "a", NA)
> v2<- c(NA, "x", "y", "z", "z","z","z", "x", NA, NA, "x", "x", "x")
> df <- as.data.frame(cbind(id, year, v1, v2))
> df
   id year   v1   v2
1   1 2014    a <NA>
2   1 2014 <NA>    x
3   1 2019 <NA>    y
4   2 2014 <NA>    z
5   2 2014    b    z
6   2 2014    a    z
7   2 2020    b    z
8   3 2018 <NA>    x
9   3 2018 <NA> <NA>
10  4 2017    c <NA>
11  4 2018 <NA>    x
12  5 2019    a    x
13  5 2019 <NA>    x
 

Вот как я хочу, чтобы мой результат выглядел:

  id year   v1   v2
1   1 2014    a    x
3   1 2019 <NA>    y
6   2 2014    a    z
7   2 2020    b    z
8   3 2018 <NA>    x
10  4 2017    c <NA>
11  4 2018 <NA>    x
12  5 2019    a    x
 

Я пытался использовать dplyr с group_by, но возникли проблемы с его запуском. Спасибо!

Ответ №1:

После группировки вы можете попробовать суммировать и получить last значение после удаления NA .

 library(dplyr)

df %>%
  group_by(id, year) %>%
  summarise(v1 = last(na.omit(v1)), 
            v2 = last(na.omit(v2)))
 

Для использования summarise со всеми столбцами (кроме тех, которые используются при группировании), вы можете сделать:

 df %>%
  group_by(id, year) %>%
  summarise_all(~ last(na.omit(.)))
 

Вывод

   id    year  v1    v2   
  <chr> <chr> <chr> <chr>
1 1     2014  a     x    
2 1     2019  NA    y    
3 2     2014  a     z    
4 2     2020  b     z    
5 3     2018  NA    x    
6 4     2017  c     NA   
7 4     2018  NA    x    
8 5     2019  a     x 
 

Комментарии:

1. Это решение работает, и это здорово — я хочу отметить, на случай, если у других людей возникнет эта проблема, что это решение удаляло NAs, пока я не выгрузил пакет data.table.