在符号R之间分割复杂的字符串

时间:2020-03-27 14:27:06

标签: r regex string

我有一个充满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中持续不断的错误最终是否会成为这种数据结构的解决之道。很想知道是否有任何建议或方向。

1 个答案:

答案 0 :(得分:2)

使用data.tablestringr的解决方案。使用data.table只是为了我个人的方便,您可以将data.framedo.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给出一个列表,其中列出了测试的字符向量的每个单元格上的所有匹配项。