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

x1c*_*bon 2 r medical

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

claim_id  status
abc123    P
abc123    R
xyz374    P
xyz386    R
Run Code Online (Sandbox Code Playgroud)

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

claim_id  status  flag
abc123    P       Yes
abc123    R       Yes
xyz374    P       No
xyz386    R       No
Run Code Online (Sandbox Code Playgroud)

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

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

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

Gop*_*ala 5

试试这个:

data1 <- data1 %>% group_by(claim_id) %>% mutate(flag = (n_distinct(status) == 2))
Run Code Online (Sandbox Code Playgroud)

这假设这些是状态字段的唯一两个可能的值.如果不是这样,你需要这样的东西:

data1 <- data1 %>% group_by(claim_id) %>% mutate(flag = (('P' %in% status) & ('R' %in% status)))
Run Code Online (Sandbox Code Playgroud)

你也可以

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

但是,使用逻辑标志可能更好.它ifelse完全避免了(使它更快)并且之后使子集非常容易:

data1 %>% 
  group_by(claim_id) %>% 
  mutate(flag = all(c("P", "R") %in% status))
Run Code Online (Sandbox Code Playgroud)