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))
我正在处理医疗索赔数据,数据文件如下所示
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))