Фильтровать данные после определенной строки - PullRequest
0 голосов
/ 17 сентября 2018

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

      id    type    value
1    001     0      1991
2    001     0      1992
3    001     1      1993
4    001     1      1994
5    002     1      1992
6    002     1      1993
7    003     0      1999
8    003     1      2000
9    003     0      2001

И я хочу выбрать строки в моем наборе данных после первого с типом, равным 1.

Окончательный ожидаемый результат долженбыть следующим:

      id    type    value


3    001     1      1993
4    001     1      1994
5    002     1      1992
6    002     1      1993

8    003     1      2000
9    003     0      2001

Я знаю, что сначала группирует его по id.Но я понятия не имею, что делать дальше.

У кого-нибудь есть предложения?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы можете установить свои данные для значений, где cumsum на группу id равно или больше 1 (или, конечно, больше 0).

В base R

idx <- as.logical(with(DF, ave(type, id, FUN = function(x) cumsum(x) >= 1)))
DF[idx, ]
#  id type value
#3  1    1  1993
#4  1    1  1994
#5  2    1  1992
#6  2    1  1993
#8  3    1  2000
#9  3    0  2001

С data.table ( см. Это сообщение )

library(data.table)
setDT(DF)[DF[, .I[cumsum(type) > 0], by = id]$V1]

данные

DF <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), type = c(0L, 
0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L), value = c(1991L, 1992L, 1993L, 
1994L, 1992L, 1993L, 1999L, 2000L, 2001L)), .Names = c("id", 
"type", "value"), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6", "7", "8", "9"))
0 голосов
/ 17 сентября 2018

С dplyr:

library(dplyr)
df %>% 
  group_by(id) %>% 
  mutate(sel = cumsum(type)) %>% 
  filter(sel > 0) %>% 
  select(id, type, value)

Результат:

# A tibble: 6 x 3
# Groups:   id [3]
     id  type value
  <int> <int> <int>
1     1     1  1993
2     1     1  1994
3     2     1  1992
4     2     1  1993
5     3     1  2000
6     3     0  2001

С основанием R:

df[with(df, ave(type, id, FUN = cumsum)) > 0, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...