#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.