Подмножество df по последнему значению, отличному от NA, в столбце

#r

#r

Вопрос:

Мой фрейм данных выглядит следующим образом:

 Year   aquil_7  aquil_8  aquil_9
2018   NA       201      222
2019   192      145      209
2020   166      121      NA
2021   190      NA       NA
 

Я хочу подмножить этот фрейм данных так, чтобы включать только те столбцы, в которых последний год, отличный от NA, равен или меньше 2020 года. В приведенном выше примере это означает удаление aquil_7 столбца, поскольку его последний год, отличный от NA, — 2021.

Как я мог это сделать?

Ответ №1:

Простой базовый ответ.

Объяснение — итерация по столбцам (объясняющая аргумент 2 в apply) для проверки заданных условий во всей базе данных, кроме первого столбца. привязка результата с помощью T, чтобы результат включал первый столбец.

 df <- read.table(text = "Year aquil_7 aquil_8 aquil_9 
2018 NA 201 222 
2019 192 145 209 
2020 166 121 NA 
2021 190 NA NA", header = T)

df[c(T, apply((!is.na(df[-1]))*df$Year, 2, function(x){max(x) < 2021}))]

Year aquil_8 aquil_9
1 2018     201     222
2 2019     145     209
3 2020     121      NA
4 2021      NA      NA
 

Ответ №2:

Не уверен, есть ли лучший способ реализовать это (но я надеюсь на это). В то же время вы могли бы, например, сделать

 library(tidyverse)
cols_to_keep <- df %>%
  pivot_longer(-Year) %>%
  group_by(name) %>%
  summarize(var = min(Year[is.na(value)]) >= 2020) %>%
  filter(var) %>%
  pull(name)

df %>%
  select(Year, cols_to_keep)