Как изменить столбец на основе значений, встречающихся в определенной последовательности? - PullRequest
5 голосов
/ 04 августа 2020

У меня есть фрейм данных df.

  df <- data.frame(ID = c(1,1,1,2,2,2,3,3,3,4,4,4,4),  process = c("inspection", "evaluation", "result","inspection", "result", "evaluation", "result", "inspection","result","evaluation","result","result","evaluation"))

Мне нужно вставить столбец true_process так, что если evaluation идет перед result для определенного ID, тогда это true. Если он появляется после или отсутствует, он должен принимать значение false.

Код, который я пробовал.

library(dplyr)
df %>% 
    group_by(ID) %>% 
    mutate(true_process = case_when(
        !any(process == "evaluation") ~ "False",
        length(process == "evaluation")[[1]] > length(process == "result")[[1]] ~ "False",
        TRUE ~ "True"
    )) 
# A tibble: 13 x 3
# Groups:   ID [4]
      ID process    true_process
   <dbl> <fct>      <chr>       
 1     1 inspection True        
 2     1 evaluation True        
 3     1 result     True        
 4     2 inspection True        
 5     2 result     True        
 6     2 evaluation True        
 7     3 result     False       
 8     3 inspection False       
 9     3 result     False       
10     4 evaluation True        
11     4 result     True        
12     4 result     True        
13     4 evaluation True 

Ожидаемый результат будет следующим:

# A tibble: 13 x 3
# Groups:   ID [4]
      ID process    true_process
   <dbl> <fct>      <lgl>       
 1     1 inspection TRUE        
 2     1 evaluation TRUE        
 3     1 result     TRUE        
 4     2 inspection FALSE       
 5     2 result     FALSE       
 6     2 evaluation FALSE       
 7     3 result     FALSE       
 8     3 inspection FALSE       
 9     3 result     FALSE       
10     4 evaluation FALSE       
11     4 result     FALSE       
12     4 result     FALSE       
13     4 evaluation FALSE    

1 Ответ

3 голосов
/ 04 августа 2020

На основе обновленных данных вы можете проверить, меньше ли индекс последнего экземпляра evaluation, чем любой из индексов result.

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(true_process = any(tail(which(process == "evaluation"), 1) < which(process == "result")))


# A tibble: 13 x 3
# Groups:   ID [4]
      ID process    true_process
   <dbl> <chr>      <lgl>       
 1     1 inspection TRUE        
 2     1 evaluation TRUE        
 3     1 result     TRUE        
 4     2 inspection FALSE       
 5     2 result     FALSE       
 6     2 evaluation FALSE       
 7     3 result     FALSE       
 8     3 inspection FALSE       
 9     3 result     FALSE       
10     4 evaluation FALSE       
11     4 result     FALSE       
12     4 result     FALSE       
13     4 evaluation FALSE
...