首页 > 解决方案 > 将字符串列表分成单独的行

问题描述

我有一个包含两列的食谱数据框:以这种方式格式化的成分列表:

成分----------------------平均评论

['鸡蛋','面粉','糖']--------4.7

我正在尝试解压缩成分列并为每个单独的成分字符串提供一行,结果如下所示:

成分:--------平均评论:

'鸡蛋'-------------4.7

'面粉'-------------4.7

'糖'-----------4.7

我们的想法是在完成此操作后汇总数据,并对包含每种成分的食谱进行平均审查。有什么建议吗?

标签: rtidyr

解决方案


如果它是一个字符串,一个选项是用 删除方括号str_remove_all,然后使用separate_rows在 'Ingredient' 处拆分,以扩展行

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

或者另一种选择是将单词提取到 alist然后执行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 Rwithregmatches/gregexpr中将单词提取到 a 中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

数据

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

推荐阅读