Ifelse 在 dplyr 中需要更长的时间来执行

Ifelse within dplyr taking a longer time to execute

我正在处理医疗索赔数据,数据文件如下所示

claim_id  status
abc123    P
abc123    R
xyz374    P
xyz386    R

我想创建一个新列作为标志,它基本上按 claim_id 分组,如果相同 claim_id 的状态包括 "P" 和 "R" .标志列应包括 "Yes"

claim_id  status  flag
abc123    P       Yes
abc123    R       Yes
xyz374    P       No
xyz386    R       No

我对此解决方案的方法是使用 dplyr :-

data <-data1 %>% 
   group_by(claim_id)%>% 
   mutate(flag = ifelse(any(status == "P" | status == "R"), 
                            "Yes", 
                             as.character(status)))

这种方法需要更长的时间,并且还会在标志列中将所有行标记为是。

试试这个:

data1 <- data1 %>% group_by(claim_id) %>% mutate(flag = (n_distinct(status) == 2))

本文假设状态字段只有这两个可能的值。如果那不是真的,你将需要这样的东西:

data1 <- data1 %>% group_by(claim_id) %>% mutate(flag = (('P' %in% status) & ('R' %in% status)))

你也可以

data1 %>% 
  group_by(claim_id) %>% 
  mutate(flag = ifelse(all(c("P", "R") %in% status), "Yes", "No"))

但是,使用逻辑标志可能会更好。它完全避免了 ifelse(使其更快)并使之后的子集化变得非常容易:

data1 %>% 
  group_by(claim_id) %>% 
  mutate(flag = all(c("P", "R") %in% status))