1) Один из вариантов - создать группирующую переменную, основанную на наличии алфавитов, summarise
путем создания вывода list
и использовать unnest_wider
, чтобы изменить list
на набор. новых столбцов
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
group_by(grp = cumsum(str_detect(col1, "[A-Za-z]"))) %>%
group_by(coln = first(col1), .add = TRUE) %>%
slice(-1) %>%
summarise(out = list(as.list(as.numeric(col1)))) %>%
unnest_wider(c(out)) %>%
ungroup %>%
select(-grp) %>%
rename_at(-1, ~ str_c('new_col', seq_along(.)))
# A tibble: 2 x 11
# coln new_col1 new_col2 new_col3 new_col4 new_col5 new_col6 new_col7 new_col8 new_col9 new_col10
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 John Doe 7 45 42 978 3 6 8 9 0 11
#2 Sally Jenkins 2 NA NA NA NA NA NA NA NA NA
2) Или с использованием base R
(пакеты не используются)
grp <- with(df1, ave(col1, cumsum(grepl('[A-Za-z]', col1)),
FUN = function(x) x[1]))
aggregate(values ~ ind, stack(split(as.numeric(df1$col1[duplicated(grp)]),
grp[duplicated(grp)])), FUN = I)
# ind values
#1 John Doe 7, 45, 42, 978, 3, 6, 8, 9, 0, 11
#2 Sally Jenkins 2
data
df1 <- structure(list(col1 = c("John Doe", "7", "45", "42", "978", "3",
"6", "8", "9", "0", "11", "Sally Jenkins", "2")), class = "data.frame",
row.names = c(NA,
-13L))