为不同的组分配场景分配标签

Assigning labels to different group assignment scenarios

我有一个 data.frameid 分配给 group。在最简单的场景中,每个 id 被分配给不同的 group:

df1 <- data.frame(group = c("a1","a2"),
                  id = c("i1","i2"),
                  stringsAsFactors = F)

在第二种情况下,所有 id 都分配给一个 group:

df2 <- data.frame(group = c("a1","a1"),
                  id = c("i1","i2"),
                  stringsAsFactors = F)

在第三种情况下,idgroup 的赋值不明确:

df3 <- data.frame(group = c("a1","a2","a2"),
                  id = c("i1","i1","i2"),
                  stringsAsFactors = F)

我正在寻找一个函数,它 return 一个标签 "scenario1"/"scenario2"/"scenario3" 给定这样一个 data.frameidgroup 列,根据上述情况。

换句话说,此函数将 return "scenario1" 用于 df1"scenario2" 用于 df2"scenario3" 用于 df3

显然这可以通过 if 语句完成,但我希望使用 dplyr/tidyversedata.table

更快

这是一个检查不同条件的函数。

library(dplyr)

return_scenario <- function(df) {
  tmp <- df %>% distinct(group, id)
  case_when(
    n_distinct(tmp$group) == 1 ~ 'scenario 2',
    n_distinct(tmp$id) == nrow(tmp) ~ 'scenario 1', 
    TRUE ~ 'scenario 3') 
}

return_scenario(df1)  
#[1] "scenario 1"  
return_scenario(df2) 
#[1] "scenario 2"   
return_scenario(df3)  
#[1] "scenario 3"

如果需要,也可以将其翻译成基础 R/data.table 及其等效功能。