如何用R语言检测存在order变量随时间递减的个体
检测数据集中order变量随时间递减的个体
数据集
首先是你的数据集定义:
ID<-c(1,1,1,1, 2,2,2, 3,3, 4,4,4,4) order<-c(44,44,45,41, 13,21,2013, 21,10, 45,65,74,877) mydata<-data.frame( ID=ID,order=order )
方法一:使用dplyr包(tidyverse风格)
适合习惯tidyverse语法的用户,步骤清晰直观:
library(dplyr) # 为每个ID生成随访时间变量Time(对应行的顺序) mydata <- mydata %>% group_by(ID) %>% mutate(Time = row_number()) %>% ungroup() # 筛选存在order递减的ID decreasing_ids <- mydata %>% group_by(ID) %>% # 计算当前order与上一个时间点的差值 mutate(order_diff = order - lag(order)) %>% # 组内只要有一次差值小于0,就标记为需要筛选的ID filter(any(order_diff < 0, na.rm = TRUE)) %>% distinct(ID) %>% pull(ID) # 查看结果 decreasing_ids
运行后输出:[1] 1 3,符合预期。
方法二:使用Base R
无需加载额外包,用原生R代码即可实现:
# 按ID拆分order数据 id_order_groups <- split(mydata$order, mydata$ID) # 遍历每个组,检查是否存在相邻order递减的情况 decreasing_ids <- names(id_order_groups)[sapply(id_order_groups, function(x) { # diff(x)得到相邻元素的差值,只要有一个差值小于0就返回TRUE any(diff(x) < 0) })] # 转换为数值型ID decreasing_ids <- as.numeric(decreasing_ids) # 查看结果 decreasing_ids
运行后同样输出:[1] 1 3。
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

