如何用R语言tidyverse包检查分组数据的前序S观测值是否存在
解决方案
问题分析
你需要按N分组后,检查每条记录的S值是否存在前序值(即S-1的数值是否在当前分组的S集合中)。注意原数据中S是字符类型,需先转换为数值再运算。
完整代码实现
library(tidyverse) # 你的数据集 df <- structure(list(N = c("a", "b", "c", "a", "b", "a", "b", "c", "a", "c"), S = c("4", "4", "4", "3", "3", "2", "2", "2", "1", "1")), class = "data.frame", row.names = c(NA, -10L)) # 管道实现逻辑 df %>% group_by(N) %>% arrange(desc(S)) %>% # 按S降序排列,匹配期望输出顺序 mutate(P = (as.numeric(S) - 1) %in% as.numeric(S)) %>% ungroup()
代码说明
- 分组与排序:按
N分组后,用arrange(desc(S))保证输出顺序和你期望的一致; - 逻辑判断:
(as.numeric(S) - 1) %in% as.numeric(S)的作用是:将当前行的S转为数值并减1,检查该值是否存在于当前分组的所有S数值中,返回TRUE/FALSE; - 取消分组:最后用
ungroup()取消分组,避免后续操作受分组状态影响。
输出结果
运行代码后会得到你期望的表格:
| N | S | P |
|---|---|---|
| a | 4 | TRUE |
| b | 4 | TRUE |
| c | 4 | FALSE |
| a | 3 | TRUE |
| b | 3 | TRUE |
| a | 2 | TRUE |
| b | 2 | FALSE |
| c | 2 | TRUE |
| a | 1 | FALSE |
| c | 1 | FALSE |
内容的提问来源于stack exchange,提问作者C. Guff
相关产品推荐
相关产品推荐

