Разбить список строк на отдельные строки - PullRequest
1 голос
/ 29 марта 2020

У меня есть блок данных рецептов, который содержит две колонки: список ингредиентов, отформатированный таким образом:

Ингредиент --------------------- -Средний обзор

['яйца', 'мука', 'сахар'] ------- 4.7

Я пытаюсь распаковать колонку с ингредиентами и дать ей строку для каждой отдельной строки ингредиента результат выглядит примерно так:

Ингредиент: ------- Средний обзор:

«яйца» ---------- --- 4,7

«мука» ------------- 4,7

«сахар» ----------- 4,7

Идея состоит в том, чтобы агрегировать данные после этого и составить среднюю рецензию на рецепты, содержащие каждый ингредиент. Любой совет?

1 Ответ

1 голос
/ 29 марта 2020

Если это строка, один из вариантов - снять квадратные скобки с str_remove_all, а затем использовать separate_rows, чтобы разделить «Ингредиент» на ,, чтобы расширить строки

library(stringr)
library(dplyr)
library(tidyr)
df1 %>%
    mutate(Ingredient = str_remove_all(Ingredient, "\\[|\\]|'")) %>%
    separate_rows(Ingredient, sep=",\\s*")
#   Ingredient AverageReview
#1       eggs           4.7
#2      flour           4.7
#3      sugar           4.7
* 1006. *

Или другой вариант - извлечь слова в list, а затем выполнить unnest

df1 %>% 
    mutate(Ingredient = str_extract_all(Ingredient, "[[:alpha:]]+")) %>%
    unnest(c(Ingredient))
# A tibble: 3 x 2
#  Ingredient AverageReview
#  <chr>              <dbl>
#1 eggs                 4.7
#2 flour                4.7
#3 sugar                4.7

Или в base R с помощью regmatches/gregexpr, чтобы извлечь слова в list, а затем создайте 'data.frame'

lst1 <- regmatches(df1$Ingredient, gregexpr("[[:alpha:]]+", df1$Ingredient))
data.frame(Ingredient = unlist(lst1), AverageReview = rep(df1$AverageReview,, lengths(lst1)))
#  Ingredient AverageReview
#1       eggs           4.7
#2      flour           4.7
#3      sugar           4.7

data

 df1 <- data.frame(Ingredient = "['eggs', 'flour', 'sugar']",
                   AverageReview = 4.7, stringsAsFactors = FALSE)
...