R - 将文本字符串解析为多列并提取数据值

Chi*_*17. 5 string parsing r

我有一个如下所示形式的大型数据集:

ID 分数
1 英语 3、法语 7、地理 8
2 西班牙语 7、古典 4
3 物理 5、英语 5、体育 7、艺术 4

我需要将“分数”列中的文本字符串解析为每个主题的单独列,并将每个人的分数存储为数据值,如下所示:

ID 英语 法语 地理 西班牙语 经典 物理 聚乙烯醇 艺术
1 3 7 8 - - - - -
2 - - - 7 4 - - -
3 5 - - - - 5 7 4

我无法手动预定义列,因为完整数据集中有 100 个列。到目前为止,我已经清理了数据以删除不一致的大写,并将每个主题标记配对分成不同的列,如下所示:

df$scores2 <- str_to_lower(df$Scores)
split <- separate(
  df,
  scores2,
  into = paste0("Subject", 1:8),
  sep = "\\,",
  remove = FALSE,
  convert = FALSE,
  extra = "warn",
  fill = "warn",
)
Run Code Online (Sandbox Code Playgroud)

我已经查看了有关该主题的多个问题,例如将不规则文本列拆分为 r 中的多个列,但我找不到列标题和数据值混合在文本字符串中的另一种情况。如何生成所需的全套列,然后填充数据值?

ben*_*n23 3

您可以首先将strsplitScores拆分为主题分数对(将在列表中),然后将unnest列表列拆分为行。然后将separate科目分数配对到SubjectScore列中。最后将数据从“长”格式转换为“宽”格式。

\n

谢谢@G。Grothendieck 改进了我的代码:)

\n
library(tidyverse)\n\ndf %>% \n  separate_rows(Scores, sep = ", ") %>% \n  separate(Scores, sep = " ", into = c("Subject", "Score")) %>% \n  pivot_wider(names_from = "Subject", values_from = "Score")\n\n# A tibble: 3 \xc3\x97 9\n     ID English French Geography Spanish Classics Physics PE    Art  \n  <int> <chr>   <chr>  <chr>     <chr>   <chr>    <chr>   <chr> <chr>\n1     1 3       7      8         NA      NA       NA      NA    NA   \n2     2 NA      NA     NA        7       4        NA      NA    NA   \n3     3 5       NA     NA        NA      NA       5       7     4    \n
Run Code Online (Sandbox Code Playgroud)\n