Вот другой способ, который не основан на итерации функций в семействах apply
или map
, если вы предпочитаете их избегать, и пытается использовать сторону tidyr
tidyverse
.Подход заключается в основном, чтобы расширить фрейм данных с gather
и separate_rows
на каждую комбинацию pastecols
и фактических столбцов, а затем filter
, чтобы мы оставляли только те, которые соответствуют для каждого rowid
.Получив это, мы можем group_by
и summarise
вернуть его в один ряд за rowid
.Есть куча делопроизводства, чтобы справиться с тем фактом, что у вас всегда есть столбец A
, и обратите внимание, что я оставляю A
в выводе pastecols
, но вы можете удалить это, если хотите.
library(tidyverse)
tbl <- tibble("A" = letters[1:4], "B" = letters[26:23], "C" = letters[c(1,3,5,7)], "D" = letters[c(2,4,6,8)], "pastecols" = c("B, C","B, D", "B, C, D", NA))
tbl %>%
rowid_to_column() %>%
mutate(
pastecols = str_c("A, ", pastecols),
pastecols = if_else(is.na(pastecols), "A", pastecols)
) %>%
gather(colname, value, -pastecols, -rowid) %>%
separate_rows(pastecols) %>%
filter(pastecols == colname) %>%
group_by(rowid) %>%
summarise(
pastecols = str_c(pastecols, collapse = ", "),
result = str_c(value, collapse = ", ")
)
#> # A tibble: 4 x 3
#> rowid pastecols result
#> <int> <chr> <chr>
#> 1 1 A, B, C a, z, a
#> 2 2 A, B, D b, y, d
#> 3 3 A, B, C, D c, x, e, f
#> 4 4 A d
Создано в 2018-12-03 пакетом Представ (v0.2.0).