Сценарий должен:
a) объединять текст в смежные строки, количество смежных строк может варьироваться, группировка строк, которые нужно объединить, определяется первой строкой, которой предшествует NA, и последней строка, за которой следует NA,
b) сохранить идентификаторы строк для дальнейшей проверки
c) сохранить переменную Numberri c, связанную с одной строкой из каждой из смежных строк, которые нужно объединить
d) сохранить общий порядок
![Before and after tables](https://i.stack.imgur.com/rtThi.png)
Я добился этого, используя для l oop и загрузки данных с dplyr и stringer.
Для l oop не элегантно, так как я борюсь с логикой c, чтобы последовательно идентифицировать соседние строки. Это не важно, так как группирующая переменная - всего лишь помощник - но это меня раздражает.
Мне также интересно, может ли быть более эффективный способ сделать это вообще, возможно, используя строку и мутировать с опережением или запаздыванием.
Будем благодарны за любые указания или указатели.
library(tidyverse)
tib <- tibble(id = 1:11,
var = c("a", NA, NA, "b", "c" , NA, "d", NA, NA, NA, "e"),
txt = c( NA, "the", "cat", NA, NA, "sat", NA, "on", "the", "mat", NA),
nr = c( NA, NA, 5, NA, NA, 10, 7, NA, NA, 15, 11),
txt_group = NA_integer_)
# txt_group = helper column for text grouping variable
txt_group_counter <- 1L
for(i in seq_len(nrow(tib))){
if (!is.na(tib$txt[i]) | !is.na(lag(tib$txt[i]))){
tib$txt_group[i] <- txt_group_counter
}
if(is.na(tib$txt[i]) | !is.na(lead(tib$txt[i]))){
txt_group_counter <- txt_group_counter + 1
}
}
tib1 <-
tib %>%
filter(!is.na(txt_group)) %>%
group_by(txt_group) %>%
mutate(id_comb = paste(id, collapse = ", "),
txt = paste(txt, collapse = " "),
nr = paste(nr, collapse = "")) %>%
select(-id) %>%
distinct() %>%
ungroup() %>%
mutate(id = as.numeric(str_extract(id_comb, "^\\d")),
nr = as.numeric(str_remove_all(nr, "[NA]"))) %>%
select(id, id_comb, everything()) %>%
bind_rows(tib %>% filter(is.na(txt_group))) %>%
arrange(id) %>%
select(-txt_group)