【问题标题】:Using case_when() across grouped rows and selecting when item present - tidyverse/R solution跨分组行使用 case_when() 并选择项目何时出现 - tidyverse/R 解决方案
【发布时间】:2021-01-25 16:58:00
【问题描述】:

我正在尝试在 tidyverse 中使用 case_when(),但专门用于在列的分组行中存在或不存在任何值时输出特定类别...

虚拟数据(d):

ID  Tired
1A  No
1A  No
1A  Yes
1B  No
1B  No
IC  Yes
ID  No
ID  No

我希望输出对每个 ID 是否疲倦进行分类。但是,如果 ID 至少有一次表示他们累了,他们就被认为是累了,他们被归类为“Y”。如果他们每次都对累说不,那就是“N”。

期望的输出(输出):

ID  Tired Category
1A  No     Y
1A  No
1A  Yes
1B  No     N
1B  No
IC  Yes    Y
ID  No     N
ID  No

我有一些代码,但它正在下降,因为我不知道如何为类别分类在列中跨组发生一次的情况编写代码:

output <- d %>% group_by(ID) %>% mutate(Category = case_when(
   Tired == "Yes" ~ Y,
    (TRUE) ~ N))

任何帮助将不胜感激!

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    我想你在找any

    library(dplyr)
    
    d %>%
      group_by(ID) %>% 
      mutate(Category = case_when(any(Tired ==  "Yes") ~ "Y",
                                  TRUE ~ "N"))
    

    给我们:

      ID    Tired Category
      <chr> <chr> <chr>   
    1 1A    No    Y       
    2 1A    No    Y       
    3 1A    Yes   Y       
    4 1B    No    N       
    5 1B    No    N       
    6 IC    Yes   Y       
    7 ID    No    N       
    8 ID    No    N    
    

    【讨论】:

    • 哈,太简单了!我差点就到了!干杯!
    • @lecb NP,很高兴为您提供帮助!
    • 抱歉再次询问,是否有相反的方法,即使用 case_when 组匹配中的所有值。基本上做相反的事情并说当所有累了==“否”时,分配一个类别?我的尝试不起作用! d %&gt;% group_by(ID) %&gt;% mutate(Category = case_when(all(Tired == "No") ~ "N", TRUE ~ "Y"))
    【解决方案2】:

    arrangesubstr 的选项

    library(dpyr)
    d %>% 
       arrange(ID, Tired == 'No') %>% 
       group_by(ID) %>% 
       mutate(Category =  substr(first(Tired), 1, 1)) %>%
       ungroup
    

    -输出

    # A tibble: 8 x 3
    #  ID    Tired Category
    #  <chr> <chr> <chr>   
    #1 1A    Yes   Y       
    #2 1A    No    Y       
    #3 1A    No    Y       
    #4 1B    No    N       
    #5 1B    No    N       
    #6 IC    Yes   Y       
    #7 ID    No    N       
    #8 ID    No    N    
    

    数据

    d <- structure(list(ID = c("1A", "1A", "1A", "1B", "1B", "IC", "ID", 
    "ID"), Tired = c("No", "No", "Yes", "No", "No", "Yes", "No", 
    "No")), class = "data.frame", row.names = c(NA, -8L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 2016-10-14
      • 2016-10-07
      相关资源
      最近更新 更多