Разбиение сложной строки между символами R - PullRequest
0 голосов
/ 27 марта 2020

У меня есть набор данных, полный идентификаторов и квалификационных строк. Моя проблема с этим в два раза; Как бороться с расщеплением между различными символами и как перебирать выходные данные в кадре данных, сохраняя при этом идентификатор.

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 - это путь к go для этой структуры данных. Хотелось бы знать иначе, если есть какие-либо рекомендации или направления.

1 Ответ

2 голосов
/ 27 марта 2020

Решение с использованием 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 дает список всех совпадений в каждой ячейке проверенного вектора символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...