我有一个充满ID和限定字符串的数据集。我的问题有两个方面。 如何处理不同符号之间的分割, 如何在保留ID的情况下向下迭代数据帧的输出。
ID <- c(1,2,3)
Qualstring <- c("LE:Science = 45 Distinctions",
"A:Chemistry = A A:Biology = A A:Mathematics = A",
"A:Biology = A A:Chemistry = A A:Mathematics = A B:Baccalaureate Advanced Diploma = Pass"
)
s <- data.frame(ID, Qualstring)
所需的输出将是:
ID Qualification Subject Grade
1 1 LE: Science 45 Distinctions
2 2 A: Chemistry A
3 2 A: Biology A
4 2 A: Mathematics A
5 3 A: Biology A
6 3 A: Chemistry A
7 3 A: Mathematics A
8 3 WB: Welsh Baccalaureate Advanced Diploma Pass
分割的共同点是“:”和“ =“,以及围绕它们的代码/单词。
从我的角度看问题,它看起来很复杂,而在excel中持续不断的错误最终是否会成为这种数据结构的解决之道。很想知道是否有任何建议或方向。
答案 0 :(得分:2)
使用data.table
和stringr
的解决方案。使用data.table
只是为了我个人的方便,您可以将data.frame
与do.call(rbind,.)
一起使用,而不是rbindlist()
library(stringr)
qual <- str_extract_all(s$Qualstring,"[A-Z]+(?=\\:)")
subject <- str_extract_all(s$Qualstring,"(?<=\\:)[\\w ]+")
grade <- str_extract_all(s$Qualstring,"(?<=\\= )[A-z0-9]+")
library(data.table)
df <- lapply(seq(s$ID),function(i){
N = length(qual[[i]])
data.table(ID = rep(s[i,"ID"],N),
Qualification = qual[[i]],
Subject = subject[[i]],
Grade = grade[[i]]
)
}) %>% rbindlist()
ID Qualification Subject Grade
1: 1 LE Science 45
2: 2 A Chemistry A
3: 2 A Biology A
4: 2 A Mathematics A
5: 3 A Biology A
6: 3 A Chemistry A
7: 3 A Mathematics A
8: 3 B Baccalaureate Advanced Diploma Pass
简而言之,我在(?<=)
之后使用正面看,在(?=)
前面使用正面看。 [A-Z]+
用于一组大写字母,[\\w ]+
用于一组单词和空格,[A-z0-9]+
用于字母(大写和小写)和数字。 string_extract_all
给出一个列表,其中列出了测试的字符向量的每个单元格上的所有匹配项。