Один из вариантов: separate_rows
library(tidyverse)
df %>%
separate_rows(x) %>%
filter(!x %in% c('c', ''))
# A tibble: 4 x 1
# x
# <chr>
#1 Police
#2 Pensions
#3 potato
#4 sweetpotato
ПРИМЕЧАНИЕ. Было бы быстрее / эффективнее разделить и filter
. Или другой вариант - извлечь слова междуth кавычки, а затем unnest
df %>%
mutate(x = str_extract_all(x, '(?<=")[A-Za-z]+')) %>%
unnest
# A tibble: 4 x 1
# x
# <chr>
#1 Police
#2 Pensions
#3 potato
#4 sweetpotato
Контрольные отметки
При немного больших данных,
df1 <- df[rep(1:nrow(df), each = 1e5), ]
system.time({
df1 %>%
separate_rows(x) %>%
filter(!x %in% c('c', ''))
})
#. user system elapsed
# 0.916 0.033 0.939
system.time({
df1 %>%
mutate(x = str_extract_all(x, '(?<=")[A-Za-z]+')) %>%
unnest
})
# user system elapsed
# 0.763 0.015 0.773
system.time({
df1 %>%
mutate(x = map(x,~eval(parse(text=.)))) %>%
unnest
})
#user system elapsed
# 15.643 1.813 17.375