Данные подмножества с момента последнего выполнения условия до последней строки кадра данных - применяются к каждому субъекту - PullRequest
1 голос
/ 02 июля 2019

У меня есть такой фрейм данных:

ID  TIME AMT  CONC
1    0   10   2 
1    1    0   1
1    5    20  15
1    10   0   30
1    12   0   16

Я хочу установить поднабор данных для каждого идентификатора субъекта, начиная с последнего раза, когда AMT> 0, и до последней строки фрейма данных для этого человека.

вывод должен быть таким:

ID  TIME AMT  CONC
1    5    20  15
1    10   0   30
1    12   0   16

Я использую RStudio.

Ответы [ 2 ]

3 голосов
/ 02 июля 2019

Мы можем использовать slice и создать последовательность между максимальным индексом где AMT > 0 и последним индексом для каждого ID.

library(dplyr)

df %>%
  group_by(ID) %>%
  slice(max(which(AMT > 0)) : n())

#     ID  TIME   AMT  CONC
#  <int> <int> <int> <int>
#1     1     5    20    15
#2     1    10     0    30
#3     1    12     0    16
2 голосов
/ 02 июля 2019

Мы можем использовать filter

library(dplyr)
df %>%
   group_by(ID) %>% 
   mutate(ind = cumsum(AMT > 0))  %>%
   filter(ind == max(ind), ind > 0) %>%
   select(-ind)
# A tibble: 3 x 4
# Groups:   ID [1]
#     ID  TIME   AMT  CONC
# <int> <int> <int> <int>
#1     1     5    20    15
#2     1    10     0    30
#3     1    12     0    16

ПРИМЕЧАНИЕ: Это также хорошо работает, когда все элементы 'AMT' равны 0 для определенной группы

df$ID[4:5] <- 2
df$AMT <- 0
df$AMT[4:5] <- c(1, 0)

Или другой вариант - меньше шагов

df %>%
  group_by(ID) %>% 
  filter(row_number() >= which.max(cumsum(AMT > 0)))

данные

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L), TIME = c(0L, 1L, 5L, 
10L, 12L), AMT = c(10L, 0L, 20L, 0L, 0L), CONC = c(2L, 1L, 15L, 
30L, 16L)), class = "data.frame", row.names = c(NA, -5L))
...