【问题标题】:dplyr Find records that have specifc set of valuesdplyr 查找具有特定值集的记录
【发布时间】:2021-10-26 16:18:34
【问题描述】:

我有一个包含一些 ID 和相关时间点的数据集。我想过滤掉具有特定时间点组合的 ID。如果我使用 %in% 或 | 进行过滤,我会从特定组合中获取 ID。我如何在 R 中做到这一点?

ID Timepoint
1 1
1 6
1 12
2 1
3 1
3 6
3 12
3 18
4 1
4 6
4 12

我想过滤具有时间点 1,6 和 12 的 ID,并排除其他 ID。

结果将是 ID 1,3 和 4

【问题讨论】:

    标签: r filter dplyr conditional-statements specification-pattern


    【解决方案1】:
    library(dplyr)
    
    df <- data.frame(ID = c(1, 1, 1, 2, 3, 3, 3, 3, 4, 4, 4),
                     Timepoint = c(1, 6, 12, 1, 1, 6, 12, 18, 1, 6, 12))
    
    df %>%
      filter(Timepoint %in% c(1, 6, 12)) %>%
      mutate(indicator = 1) %>%
      group_by(ID) %>%
      complete(Timepoint = c(1, 6, 12)) %>%
      filter(!ID %in% pull(filter(., is.na(indicator)), ID)) %>%
      select(indicator)
    

    输出:

    # A tibble: 9 × 2
    # Groups:   ID [3]
         ID indicator
      <dbl>     <dbl>
    1     1         1
    2     1         1
    3     1         1
    4     3         1
    5     3         1
    6     3         1
    7     4         1
    8     4         1
    9     4         1
    

    【讨论】:

    • 嗨,我想要具有所有三个时间点(1,6 和 12)的 ID。在这种情况下,结果应该只有 1,3 和 4,因为 ID 2 只有 Timepoint1。
    【解决方案2】:

    我们可以使用

    library(dplyr)
    df %>% 
        group_by(ID) %>% 
        filter(all(c(1, 6, 12) %in% Timepoint)) %>% 
        ungroup
    

    -输出

    # A tibble: 10 x 2
          ID Timepoint
       <dbl>     <dbl>
     1     1         1
     2     1         6
     3     1        12
     4     3         1
     5     3         6
     6     3        12
     7     3        18
     8     4         1
     9     4         6
    10     4        12
    

    【讨论】:

    • 嗨,我想要具有所有三个时间点(1,6 和 12)的 ID。在这种情况下,结果应该只有 1,3 和 4,因为 ID 2 只有 Timepoint1。
    【解决方案3】:

    根据您的数据,ID 2 的时间点为 1。因此,如果按时间点 1、6、12 过滤,结果将是 1、2、3、4,而不是 1、3、4。

    ids <- c(1, 1, 1, 2, 3, 3, 3, 3, 4, 4, 4)
    time_points <- c(1, 6, 12, 1, 1, 6, 12, 18, 1, 6, 12)
    dat <- data.frame(ids, time_points)
    unique(dat$ids[dat$time_points %in% c(1, 6, 12)])
    

    【讨论】:

      猜你喜欢
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多