R语言实现分组数据条件行删除,生成终端观测数据集
R语言筛选终端观测数据集解决方案
核心逻辑
按year和tree.id分组,对每组内pa=0的观测,仅保留week值最大的行(删除同组内pa=0且week较小的行);pa≠0的观测全部保留。
可行代码(基于dplyr)
library(dplyr) # 处理数据集,得到终端观测 terminal_obs_final <- terminal.obs.fr %>% group_by(year, tree.id) %>% # 筛选规则:要么pa不等于0,要么是当前组pa=0观测中week最大的行 filter(pa != 0 | week == max(week[pa == 0], na.rm = TRUE)) %>% ungroup()
代码说明
group_by(year, tree.id):按年份和树ID分组,确保每组内是同一棵树同一年的观测max(week[pa == 0], na.rm = TRUE):仅计算当前组内pa=0观测的最大week值,na.rm=TRUE避免空值报错filter():筛选出符合条件的行,保留所有pa≠0的观测,以及pa=0中week最大的观测ungroup():取消分组,返回普通数据框
你之前代码的问题
你尝试用ifelse直接结合group_by的写法不符合dplyr的语法逻辑,group_by后需要用dplyr的分组操作函数(如filter、slice)来处理每组数据,而非基函数ifelse。
另一种简洁写法(用slice_max)
如果你的需求是对每个pa状态都取对应组的最大week行,也可以用以下写法:
terminal_obs_final <- terminal.obs.fr %>% group_by(year, tree.id, pa) %>% slice_max(week, n = 1) %>% ungroup()
这种写法会对(year, tree.id, pa)组合分组,每组仅保留week最大的一行,适合更通用的分组取极值场景。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

