按值作为给定集的子集过滤数据帧

假设我们有一些人做不同的活动 .

data <- data.frame(person=c('A','A','A','B','B','B','C','C'), activity=c(1,2,3,1,2,3,1,2))

我想过那些只进行“相关活动”的人过滤数据,其中相关活动由另一个载体定义 .

relevant_activities <- c(1,2)

因此,一个人的活动 Value 必须是相关活动的一个子集 .

预期结果:

person activity
1      C        1
2      C        2

我试过这样的事情,没有成功:

library(dplyr)
data %>%
  group_by(person) %>%
  filter(all(relevant_activities %in% activity))

回答(2)

2 years ago

我们可以用 all 换行

data %>% 
     group_by(person) %>% 
     filter(all(activity %in% relevant_activities))

2 years ago

这是一个 data.table 的解决方案

library("data.table")

D <- data.table(person=c('A','A','A','B','B','B','C','C'), activity=c(1,2,3,1,2,3,1,2))
relevant_activities <- c(1,2)

D[person %in% D[, all(activity %in% relevant_activities), person][, person[V1]]]

或者使用数据表上的键:

D <- data.table(person=c('A','A','A','B','B','B','C','C'),
        activity=c(1,2,3,1,2,3,1,2), key="person")
relevant_activities <- c(1,2)

D[D[, all(activity %in% relevant_activities), person][, person[V1]]]