R语言如何过滤掉年级不满足连续递增顺序的学生对应数据
实现思路
核心判断逻辑:对每个学生id对应的所有年级取值去重后排序,若相邻两个年级的差值均为1,则该学生年级符合连续递增要求,保留其全部数据,否则移除该学生的所有数据。
实现代码
方案1:tidyverse(dplyr)实现
这是最简洁易读的写法:
library(dplyr) df_result <- df %>% # 按学生id分组 group_by(id) %>% # 仅保留年级完全连续的分组 filter(all(diff(sort(unique(grade))) == 1)) %>% # 取消分组 ungroup()
也可以用更高效的数值判断替换diff逻辑,效果完全一致:
df_result <- df %>% group_by(id) %>% filter(max(grade) - min(grade) + 1 == length(unique(grade))) %>% ungroup()
方案2:R原生代码实现
无需加载第三方包:
# 提取所有年级连续的学生id valid_ids <- sapply(split(df$grade, df$id), function(g) { g_sorted <- sort(unique(g)) all(diff(g_sorted) == 1) }) valid_ids <- as.integer(names(valid_ids)[valid_ids]) # 筛选最终结果 df_result <- df[df$id %in% valid_ids, ]
输出验证
运行上述代码后df_result的结果和预期完全一致:
> df_result # A tibble: 6 × 4 id category year grade <dbl> <chr> <dbl> <dbl> 1 1 A 18 3 2 1 A 19 4 3 1 A 20 5 4 1 B 18 3 5 1 B 19 4 6 1 B 20 5
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

