dplyr case_when 跨组

sah*_*ahn 1 r dplyr

我有 df

df = data.frame(
    group = c(rep("A", 3), rep("B", 3)), 
    vt = c("SO:0001574", "SO:0001619", "SO:0001619", "SO:0001619", "SO:0001619", "SO:0001821")
    )
Run Code Online (Sandbox Code Playgroud)

和两个向量:

tier_1 = c("SO:0001574", "SO:0001575")
tier_2 = c("SO:0001821", "SO:0001822")
Run Code Online (Sandbox Code Playgroud)

我想产生一个输出:

  group         vt     ct
1     A SO:0001574 tier_1
2     A SO:0001619 tier_1
3     A SO:0001619 tier_1
4     B SO:0001619 tier_2
5     B SO:0001619 tier_2
6     B SO:0001821 tier_2
Run Code Online (Sandbox Code Playgroud)

即我想生成第三列 ct,它根据 tier_1 或 tier_2 中 vt 列的存在进行填充,以便给定组中的所有行都填充该层类型。

我试过了:

df %>%
    dplyr::group_by(group) %>% 
    dplyr::mutate(tier = dplyr::case_when(
        vt %in% tier_1 ~ "tier_1",
        vt %in% tier_2 ~ "tier_2"))
Run Code Online (Sandbox Code Playgroud)

但这只会填充单个行,而不是组中的所有行:

# A tibble: 6 x 4
# Groups:   group [2]
  group vt         ct     tier  
  <chr> <chr>      <chr>  <chr> 
1 A     SO:0001574 tier_1 tier_1
2 A     SO:0001619 tier_1 NA    
3 A     SO:0001619 tier_1 NA    
4 B     SO:0001619 tier_2 NA    
5 B     SO:0001619 tier_2 NA    
6 B     SO:0001821 tier_2 tier_2
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 5

包装代码any以获得每组一个逻辑值:

library(dplyr)

df %>%
 group_by(group) %>% 
 mutate(tier = case_when(
                any(vt %in% tier_1) ~ "tier_1",
                any(vt %in% tier_2) ~ "tier_2"))

#  group vt         tier  
#  <chr> <chr>      <chr> 
#1 A     SO:0001574 tier_1
#2 A     SO:0001619 tier_1
#3 A     SO:0001619 tier_1
#4 B     SO:0001619 tier_2
#5 B     SO:0001619 tier_2
#6 B     SO:0001821 tier_2
Run Code Online (Sandbox Code Playgroud)