1

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

ID 时间点
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

4

3 回答 3

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
于 2021-08-26T15:24:58.733 回答
1

我们可以用

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
于 2021-08-26T16:00:38.593 回答
-1

根据您的数据,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)])
于 2021-08-26T15:36:08.880 回答