我正在处理医疗索赔数据,数据文件如下所示
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)))
此方法需要较长时间,并且还会在标记列中将所有行标记为“是”。
答案 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))