Если вектор содержит 3 из 5 элементов, возвращаем все для этого идентификатора == TRUE в dplyr - PullRequest
3 голосов
/ 25 апреля 2020

Я пытаюсь получить все идентификаторы, содержащие не менее трех из пяти элементов c (2,3,4,5,6), чтобы вернуть TRUE для каждой строки этого идентификатора и false для других идентификаторов.

id <- c(1,1,2,2,3,3,3,3)
time <- c(4,6,4,5,4,5,6,7)
df1 <- data.frame(id,time)

Решение

solution <-c(FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE)
df_w_sol <- data.frame(df1,solution)

Я пробую комбинации:

df1 %>%
  group_by(id) %>%
  mutate(INCLUDE = any(2:6 %in% time))

Но борьба - это "по крайней мере 3 из 5" Я считаю, что n> section.

Ответы [ 3 ]

5 голосов
/ 25 апреля 2020

Вы можете использовать sum для подсчета количества совпадающих значений:

library(dplyr)
df1 %>% group_by(id) %>% mutate(solution = sum(2:6 %in% time) >= 3)

#    id  time solution
#  <dbl> <dbl> <lgl>   
#1     1     4 FALSE   
#2     1     6 FALSE   
#3     2     4 FALSE   
#4     2     5 FALSE   
#5     3     4 TRUE    
#6     3     5 TRUE    
#7     3     6 TRUE    
#8     3     7 TRUE    

Эквивалент в базе R

transform(df1, solution = ave(time, id, FUN = function(x)  sum(2:6 %in% x)) >= 3) 

и data.table

library(data.table)
setDT(df1)[, solution := sum(2:6 %in% time) >= 3, id]
1 голос
/ 25 апреля 2020

Мы можем использовать length с intersect

library(dplyr)
df1 %>% 
  group_by(id) %>%
  mutate(solution = length(intersect(time, 2:6))>=3)
# A tibble: 8 x 3
# Groups:   id [3]
#    id  time solution
#  <dbl> <dbl> <lgl>   
#1     1     4 FALSE   
#2     1     6 FALSE   
#3     2     4 FALSE   
#4     2     5 FALSE   
#5     3     4 TRUE    
#6     3     5 TRUE    
#7     3     6 TRUE    
#8     3     7 TRUE    

Или с data.table

library(data.table)   
setDT(df1)[, solution := length(intersect(time, 2:6))>=3, id]
1 голос
/ 25 апреля 2020

Один из вариантов может быть:

df1 %>%
 group_by(id) %>%
 mutate(include = n_distinct(match(time, 2:6)) >= 3)

     id  time include
  <dbl> <dbl> <lgl>  
1     1     4 FALSE  
2     1     6 FALSE  
3     2     4 FALSE  
4     2     5 FALSE  
5     3     4 TRUE   
6     3     5 TRUE   
7     3     6 TRUE   
8     3     7 TRUE 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...