【问题标题】:R dplyr `group_by` seems not working to create a new value using `case_when`?R dplyr `group_by` 似乎无法使用 `case_when` 创建新值?
【发布时间】:2020-04-20 07:13:48
【问题描述】:

我正在尝试根据site 组和使用case_when 的条件在数据框中创建一个新列。但是,我的输出似乎忽略了我的组?

我的例子:

site     = c("a", "b", "b", "d", "d", "d", "e", "f", "g")
distance = c("PA", "PA", "5", "PA", "20", "5", "5", "20", "PA")
df <- data.frame(site, 
                 distance)

申请条件:

  • 如果只有 PA by group -> PA
  • 如果有 PA 和其他东西 -> 不清楚
  • 如果有其他东西(不是 PA)-> 缓冲区

脚本:

df %>% 
  group_by(site) %>% 
  mutate(source = case_when(distance == "PA" ~ "PA",
                            any(c("PA") %in% distance) ~ "unclear",
                            TRUE ~ "buffer")) 

我的示例似乎在行方面运行良好,但没有考虑到组?

site 组的预期输出:

  site  distance source 
  <fct> <fct>    <chr>  
1 a     PA       PA     
2 b     PA       unclear    # not PA
3 b     5        unclear
4 d     PA       unclear    # not PA, as the group contains other values! 
5 d     20       unclear
6 d     5        unclear
7 e     5        buffer 
8 f     20       buffer 
9 g     PA       PA     

【问题讨论】:

    标签: r tidyverse tidyr


    【解决方案1】:

    你应该使用以下条件:

    library(dplyr)
    
    df %>% 
      group_by(site) %>% 
      mutate(source = case_when(
                        #if there is only PA by group
                        all(distance == "PA") ~ "PA",
                        #PA + something else
                        any(distance == "PA") && any(distance != "PA") ~ "unclear",
                        #everything else
                        TRUE ~ "buffer")) 
    
    
    #  site  distance source 
    #  <fct> <fct>    <chr>  
    #1 a     PA       PA     
    #2 b     PA       unclear
    #3 b     5        unclear
    #4 d     PA       unclear
    #5 d     20       unclear
    #6 d     5        unclear
    #7 e     5        buffer 
    #8 f     20       buffer 
    #9 g     PA       PA     
    

    【讨论】:

    • 您可以跳过&amp;&amp; any(distance != "PA") 块,因为case_when 的执行从第一个表达式到最后一个表达式,并且这个条件(any(distance != "PA"))已经被考虑到第二个表达式。
    • 是的,这是真的。它可以使查询更短、更快。虽然,如果数据不是太大并且速度不是一个真正的因素,我仍然会保留它,因为它清楚地表明了我们正在检查的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多