【问题标题】:How to mutate a column based on values occurring in a particular sequence?如何根据特定序列中出现的值改变列?
【发布时间】:2020-11-24 18:42:05
【问题描述】:

我有一个数据框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 出现在特定IDresult 之前,那么它就是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    

【问题讨论】:

    标签: r data-manipulation dplyr


    【解决方案1】:

    根据您更新的数据,您可以检查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
    

    【讨论】:

    • 这确实适用于测试数据,但是如果您尝试使用df[-2, ],那么只有一个检查,然后是一个没有评估的结果,那么您会得到我认为不需要的 TRUE根据文字描述。当然,我不确定这是否会发生。也许只需添加any(process == "evaluation")
    • 感谢您的解决方案。但我实际的 df 看起来像这样。 df &lt;- 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")) 。在此 df 中,当 ID==4 列时 true_process 的输出应返回 FALSE,因为结果已在评估之前出现。但是您的代码返回 True。如何做到这一点?
    • @Silent_bliss - 查看更新的答案。您还应该将新的示例数据编辑到上述问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多