Есть ли лучший способ ввести идентификатор длины пробега в присутствии NA?

#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;