You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:如何基于指定年份的NA值有条件移除数据分组

问题:按指定年份的非NA值筛选城市分组

我需要基于以下数据集,筛选出第4年和第5年的value均不为NA的城市分组,保留这些城市的所有年份数据,移除不符合条件的城市全部行:

df <- tibble(city =c("la", "la", "la", "la", "la", "nyc", "nyc", "nyc", "nyc", "nyc", "bos", "bos", "bos", "bos", "bos"),
             year = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
             value=c(NA, NA, NA, 20, 25, 18, 29, 24, 17, 30, 12, 19, 17, 22, NA))

数据集预览:

# A tibble: 15 × 3
   city   year value
   <chr> <dbl> <dbl>
 1 la        1    NA
 2 la        2    NA
 3 la        3    NA
 4 la        4    20
 5 la        5    25
 6 nyc       1    18
 7 nyc       2    29
 8 nyc       3    24
 9 nyc       4    17
10 nyc       5    30
11 bos       1    12
12 bos       2    19
13 bos       3    17
14 bos       4    22
15 bos       5    NA

具体需求

  • 保留la的全部5行(第4、5年value均不为NA)
  • 保留nyc的全部5行(所有年份value均不为NA)
  • 移除bos的全部行(第5年value为NA)

之前的方案会筛选所有年份无NA的城市,导致la也被移除,不符合需求:

df %>%
  group_by(city) %>%
  filter(!anyNA(value))

解决方案

针对性检查第4年和第5年的value是否都不为NA即可,以下两种写法都能实现需求:

写法一:用all()批量检查指定年份

library(dplyr)

df %>%
  group_by(city) %>%
  filter(all(!is.na(value[year %in% c(4, 5)]))) %>%
  ungroup()

写法二:分别检查第4年和第5年

df %>%
  group_by(city) %>%
  filter(!is.na(value[year == 4]) & !is.na(value[year == 5])) %>%
  ungroup()

运行后会得到符合要求的结果:仅保留la和nyc的所有行,bos的行全部被移除。

内容的提问来源于stack exchange,提问作者dd_data

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:25:28