как удалить наблюдения в R в зависимости от конкретного условия - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь отбросить наблюдения в R из моего набора данных. Мне нужно, чтобы у каждого Person_ID была волна 0 И (волна 1 ИЛИ волна 3 ИЛИ волна 6 ИЛИ волна 12 ИЛИ волна 18). Кто-нибудь может мне помочь?

Начальный набор данных

Person_ID   wave
    1            0
    1            1
    1            3
    1            6
    1            12
    1            18
    2            0
    3            0
    3            1
    4            6
    4            12

Требуемый результат

Person_ID   wave
    1            0
    1            1
    1            3
    1            6
    1            12
    1            18
    3            0
    3            1

Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Вы можете сделать сгруппированный фильтр.Мы сохраняем человека, если и 0, и любой из 1, 3, 6, 12, 18 находятся в соответствующих значениях wave.

library(tidyverse)

tbl <- read_table2(
  "Person_ID   wave
    1            0
    1            1
    1            3
    1            6
    1            12
    1            18
    2            0
    3            0
    3            1
    4            6
    4            12"
)
tbl %>%
  group_by(Person_ID) %>%
  filter(0 %in% wave, any(c(1, 3, 6, 12, 18) %in% wave))
#> # A tibble: 8 x 2
#> # Groups:   Person_ID [2]
#>   Person_ID  wave
#>       <dbl> <dbl>
#> 1         1     0
#> 2         1     1
#> 3         1     3
#> 4         1     6
#> 5         1    12
#> 6         1    18
#> 7         3     0
#> 8         3     1

Создано в 2019-03-25 с помощью пакета Представить (v0.2.1)

0 голосов
/ 26 марта 2019

Мы также можем сделать это в base R

df1[with(df1, Person_ID %in% intersect(Person_ID[wave %in% c(1, 3, 6, 12, 18)],
           Person_ID[!wave])),]
#  Person_ID wave
#1         1    0
#2         1    1
#3         1    3
#4         1    6
#5         1   12
#6         1   18
#8         3    0
#9         3    1

данные

 df1 <- structure(list(Person_ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 3L, 
  3L, 4L, 4L), wave = c(0L, 1L, 3L, 6L, 12L, 18L, 0L, 0L, 1L, 6L, 
  12L)), class = "data.frame", row.names = c(NA, -11L))
...