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

如何在R中筛选出各季节均有样本的站点数据?

解决方法(R语言)

首先修正你提供的示例数据(原代码末尾缺少闭合括号,且站点B的季节s推测是输入错误,改为su以匹配你描述的场景):

df <- data.frame(site = c('D', 'D', 'D', 'D', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B'),
                 result = c('1', '2', '1.5', '3', '1.8', '7', '3.2', '4', '1','1.1', '3', '3.3', '2', '5', '4'),
                 season = c('w', 'sp', 'su', 'a', 'sp', 'sp', 'sp', 'su', 'a','a', 'w', 'w', 'sp', 'w', 'su')
)

接下来用dplyr包实现筛选,步骤清晰直接:

代码实现

# 先安装dplyr包(首次使用时运行)
# install.packages("dplyr")
library(dplyr)

# 获取数据中所有的季节类型,作为判断基准
all_seasons <- unique(df$season)

# 按站点分组,筛选出覆盖所有季节的站点数据
filtered_df <- df %>%
  group_by(site) %>%
  # 检查当前站点是否包含所有季节类型
  filter(all(all_seasons %in% season)) %>%
  # 取消分组,恢复普通数据框格式
  ungroup()

代码解释

  • group_by(site):把数据按站点拆分成分组
  • filter(all(all_seasons %in% season)):all_seasons %in% season会逐个验证每个全局季节是否存在于当前站点的季节列表中,all()确保所有验证结果都是TRUE——也就是该站点覆盖了所有季节
  • ungroup():取消分组状态,避免后续操作受分组限制

更直观的备选写法

如果想先给每个站点标记是否符合条件,再筛选,可以用下面的代码:

filtered_df <- df %>%
  group_by(site) %>%
  # 添加辅助列标记站点是否覆盖所有季节
  mutate(has_all_seasons = all(all_seasons %in% season)) %>%
  # 筛选符合条件的行
  filter(has_all_seasons) %>%
  # 移除辅助列
  select(-has_all_seasons) %>%
  ungroup()

运行后,filtered_df会只保留覆盖所有季节的站点D和A,站点B的所有行都会被删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:00:54