R语言:按ID删除首次年份非连续后的行及代码正确性排查
问题分析与解法
你的代码写法不正确,警告的原因是:
mutate会给每个分组内的每一行都生成break_index值,导致slice(1:break_index)中的break_index是包含多个重复元素的向量,R只能读取向量的第一个元素,因此抛出警告。- 另外,代码没有处理「分组内年份完全连续」的情况,此时
which(diff(year) > 1)[1]会返回NA,直接用1:break_index会报错。
正确解法
推荐两种简洁的实现方式,均能满足需求且避免警告:
方法一:基于累积标记筛选
通过标记首次断裂位置,筛选断裂前的所有行:
library(dplyr) final = my_data %>% group_by(id) %>% # 标记当前行是否是断裂前的最后一行(下一行年份不连续) mutate(is_break_point = c(diff(year) > 1, FALSE)) %>% # 只保留首次断裂发生前的所有行(累积标记为0的行) filter(cumsum(is_break_point) == 0) %>% select(-is_break_point) %>% ungroup()
方法二:在slice中直接计算分组内的断裂位置
针对每个分组单独计算断裂位置,同时兼容无断裂的情况:
final = my_data %>% group_by(id) %>% slice({ # 获取首次年份断裂的位置(diff结果的索引对应原数据的前一行) break_pos = which(diff(year) > 1)[1] # 若无断裂则保留全部行,否则保留到断裂位置的前一行 if (is.na(break_pos)) 1:n() else 1:break_pos }) %>% ungroup()
验证结果
运行任意一种方法后,输出结果符合需求:
> final # A tibble: 6 × 3 id year var <dbl> <dbl> <dbl> 1 1 2010 1 2 1 2011 7 3 1 2012 3 4 1 2013 9 5 2 2015 88 6 2 2016 12
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

