r - 用 r 中的规范对长数据进行切片
问题描述
如果我有看起来像这样的数据
id<-c(1,1,1,1,2,2,2,3,3,3,3,4,4,4,5,5,5,5,5)
age<-c(12,14,15,16,12,13,14,14,16,17,19,12,13,14,15,16,18,20,21)
grade<-c('B','C','C','A','D','B','B','A','B','A','A','D','F','B','F','F','B','B','C')
data<-data.frame(id,age,grade)
假设 ID 是每个学生 (1:5) 在不同时间测量他们的成绩,我想看看在他们获得第一个 B 后他们的后续成绩变化发生在什么年龄。对于学生 1,他在 12 岁时获得 B,他/她在 14 岁时获得了 C,这是直截了当的。然而,对于学生 5,他/她在 18 岁时第一次获得 B,然后在 20 岁时再次获得 B,因此第一次年级变化发生在 21 岁,即 C。
我认为切片将是最好的选择。
data %>% group_by(id,grade) %>% slice(which.min(age))
但我不确定如何包含接下来的几行来捕捉 B 变成另一个等级的“年龄”(不再是 B)。
解决方案
一个data.table
选项
setDT(data)[, .SD[first(which((1:.N) > first(which(grade == "B")) &
grade != "B"))], id]
给
id age grade
1: 1 14 C
2: 3 17 A
3: 5 21 C
推荐阅读
- python - ValueError: DepthwiseConv2D 要求 stride 属性包含 4 个值,但得到:3
- java - 为什么我的树旋转没有呈现正确的值
- spring-boot - 不稳定的 Primefaces 文件上传监听器调用
- flutter - 错误的图标flutter android素材
- keystonejs - Keystonejs 6 中的静态文件服务
- javascript - 如果条件为真,如何使用 jQuery 禁用复选框?
- amazon-web-services - AWS 基于用户池创建用户存储
- javascript - 检索钩子的父组件引用
- android - 为什么应用程序在 Firebase 项目的项目设置的 App Check (beta) 中未注册?
- javascript - 反应发送对象数组作为表单数据