繁体   English   中英

通过列中的最后一个非 NA 值对 df 进行子集

[英]Subset a df by the last non-NA value in a column

我的 dataframe 看起来像这样:

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

我想对这个 dataframe 进行子集化,以便仅包括最后一个非 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)

一个简单的 baseR 答案。

说明 - 逐列(在应用中解释 arg 2)迭代以检查除第一列之外的所有数据库的给定条件。 用 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM