我有一个如下所示形式的大型数据集:
| 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 中的多个列,但我找不到列标题和数据值混合在文本字符串中的另一种情况。如何生成所需的全套列,然后填充数据值?
您可以首先将strsplit列Scores拆分为主题分数对(将在列表中),然后将unnest列表列拆分为行。然后将separate科目分数配对到Subject和Score列中。最后将数据从“长”格式转换为“宽”格式。
谢谢@G。Grothendieck 改进了我的代码:)
\nlibrary(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 \nRun Code Online (Sandbox Code Playgroud)\n