R 按列中最后一个非NA值子集df

R 按列中最后一个非NA值子集df,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年 我怎样才能做到这

我的数据框如下所示:

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年


我怎样才能做到这一点呢?

不确定是否有更好的方法来实现这一点(但我确实希望如此)。与此同时,你可以

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)
库(tidyverse)
cols_to_keep%
枢轴_更长(-Year)%>%
分组单位(名称)%>%
汇总(var=min(年[is.na(值)])>=2020)%>%
过滤器(var)%>%
拉(名字)
df%>%
选择(年份、要保留的列)
一个简单的更基本的答案

explaution-columnwise(即应用中的arg2解释)迭代检查除第一列之外的所有数据库上的给定条件。C用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
df