Вот попытка использования tidyr::separate
для временного разделения столбца тикеров на отдельные столбцы. Удлините / приведите в порядок данные и затем отфильтруйте их, чтобы получить то, что вы хотите.
Буду благодарен за комментарии, которые помогут улучшить эту технику.
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(tidyr))
suppressPackageStartupMessages(library(purrr))
company.tickers = c(
"CARD3",
"CSAN3",
"CVCB3",
"ELET3;ELET5;ELET6",
"ENBR3",
"FESA3;FESA4",
"OIBR3;OIBR4",
"PETR3;PETR4",
"PTBL3",
"TUPY3",
"VLID3")
random.data <- runif(length(company.tickers))
stocks <- c("CARD3", "TUPY3", "OIBR3", "FESA4", "PTBL3", "VLID3", "CNTO3", "CSAN3", "ELET3", "PETR4", "ENBR3")
# construct a data frame
df <- dplyr::tibble(company.tickers, random.data)
# work out how many columns `separate` will need, and create a vector of unusual column names
# it feels weird that we need to do this
# but without this I always get an error from `separate` in the next step
new_cols <- paste0("zqzcol", 1:max(map_int(strsplit(df$company.tickers, ";"), length)))
# temporarily create new columns using `separate`
# then use `pivot_longer` to reabsorb these into long, tidy data
# then filter this by what is in `stocks`
# then tidy up using `select` (optional)
df %>%
tidyr::separate(col = company.tickers, sep = ";", into = new_cols) %>%
pivot_longer(cols = starts_with("zqzcol"), values_to = "company.tickers", values_drop_na = TRUE) %>%
filter(company.tickers %in% stocks) %>%
select(company.tickers, everything(), -name)
#> Warning: Expected 3 pieces. Missing pieces filled with `NA` in 10 rows [1, 2, 3,
#> 5, 6, 7, 8, 9, 10, 11].
#> # A tibble: 10 x 2
#> company.tickers random.data
#> <chr> <dbl>
#> 1 CARD3 0.568
#> 2 CSAN3 0.0370
#> 3 ELET3 0.119
#> 4 ENBR3 0.276
#> 5 FESA4 0.196
#> 6 OIBR3 0.301
#> 7 PETR4 0.504
#> 8 PTBL3 0.712
#> 9 TUPY3 0.790
#> 10 VLID3 0.956
Создано на 2020-03-05 по представит пакет (v0.3.0)