使用r中的规范对长数据进行切片

使用r中的规范对长数据进行切片,r,tidyverse,slice,R,Tidyverse,Slice,如果我有这样的数据 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<-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)

idA
data.table
选项

setDT(data)[, .SD[first(which((1:.N) > first(which(grade == "B")) &
           grade != "B"))], id]
给予


这可能是使用dplyr的滞后函数的解决方案:

data %>% 
  group_by(id) %>%
  arrange(id, age, grade) %>%
  mutate(tag = ifelse(grade == lag(grade), "Same Grade", "Different Grade"))

带有
dplyr的选项

library(dplyr)
data %>%
    group_by(id) %>%
    filter(!(duplicated(grade) & grade == 'B') ) %>%
    slice(match('B', grade) + 1)
# A tibble: 3 x 3
# Groups:   id [3]
#     id   age grade
#  <dbl> <dbl> <chr>
#1     1    14 C    
#2     3    17 A    
#3     5    21 C    
库(dplyr)
数据%>%
分组依据(id)%>%
过滤器(!(重复(等级)&等级='B'))%>%
切片(匹配('B',等级)+1)
#一个tibble:3x3
#组别:id[3]
#身份证年龄等级
#    
#1114 C
#2 3 17 A
#3521C
library(dplyr)
data %>%
    group_by(id) %>%
    filter(!(duplicated(grade) & grade == 'B') ) %>%
    slice(match('B', grade) + 1)
# A tibble: 3 x 3
# Groups:   id [3]
#     id   age grade
#  <dbl> <dbl> <chr>
#1     1    14 C    
#2     3    17 A    
#3     5    21 C