#r #dplyr #run-length-encoding
Вопрос:
У меня есть эти данные:
df lt;- data.frame( Sequ = c(NA, 8, 8, NA, 1, 1, 1, NA, NA, NA, 22, 22, NA), Q = c(NA, "q_x", "", NA, "q_2", "", "", NA, NA, NA, "q_xyz", "", NA) )
Что я хотел бы сделать, так это ввести правильный идентификатор длины пробега Sequ
там, где его нет NA
. То, что я пробовал до сих пор, дает мне желаемый результат, но я чувствую, что должен быть лучший, более эффективный, более лаконичный способ:
cats = c("q_x", "q_2", "q_xyz") df %gt;% mutate(Sequ = cumsum(Q %in% cats)) %gt;% mutate(Sequ = ifelse(is.na(Q), NA, Sequ)) Sequ Q 1 NA lt;NAgt; 2 1 q_x 3 1 4 NA lt;NAgt; 5 2 q_2 6 2 7 2 8 NA lt;NAgt; 9 NA lt;NAgt; 10 NA lt;NAgt; 11 3 q_xyz 12 3 13 NA lt;NAgt;
Какая-нибудь помощь?
Ответ №1:
Еще одно возможное решение,
library(dplyr) df %gt;% mutate(Sequ = replace(Sequ, !is.na(Sequ), cumsum(grepl('q', Q))[!is.na(Sequ)])) Sequ Q 1 NA lt;NAgt; 2 1 q_x 3 1 4 NA lt;NAgt; 5 2 q_2 6 2 7 2 8 NA lt;NAgt; 9 NA lt;NAgt; 10 NA lt;NAgt; 11 3 q_xyz 12 3 13 NA lt;NAgt;