如何根据特定条件删除R中的观察值

时间:2019-03-25 21:52:16

标签: r complete

我正在尝试从数据集中删除R中的观测值。我需要每个Person_ID都具有波0 AND(波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 个答案:

答案 0 :(得分:3)

您可以进行分组过滤。如果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

reprex package(v0.2.1)于2019-03-25创建

答案 1 :(得分:0)

我们也可以在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))