脚本需要:
a) 合并相邻行中的文本,相邻行的数量可能会有所不同,要合并的行的分组由第一行前面加 NA 和最后一行后面加 NA 确定,
b) 保留行 ID 以供将来检查
c) 保留与要组合的每一相邻行中的一行相关联的数值变量
d) 保留整体秩序
我使用 for 循环和与 dplyr 和 stringer 争吵的大量数据实现了这一点。
for 循环是不优雅的,因为我正在努力使用按顺序识别相邻行的逻辑。这并不重要,因为分组变量只是一个帮手——但这让我很恼火。
我还想知道是否有一种更有效的方法可以完全做到这一点,比如使用 rowwise 和 mutate with lead 或 lag。
任何指导或指示将不胜感激。
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)