如何在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
相关产品推荐
相关产品推荐

