在dplyr中的ifelse花费更长的时间来执行

时间:2016-01-12 19:21:18

标签: r medical

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

claim_id  status
abc123    P
abc123    R
xyz374    P
xyz386    R

我想创建一个新列作为标记,它基本上将由claim_id分组,如果同一个claim_id的状态包括" P"和" R"。标志栏应包括"是"

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)))

此方法需要较长时间,并且还会在标记列中将所有行标记为“是”。

1 个答案:

答案 0 :(得分:5)

试试这个:

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))