Строки в R - вставка пробела между выбранным символом алфавита и числовыми символами

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

Итак, 2EA 28 будет этажом 2, Ward East и Bed 28.

Локации были введены с несовместимыми пробелами, так что у меня есть следующее:

   toyraw<-data.table(incident_no = c(1:6), location =c("2EA17","2EA 17", "1ED1", "1ED23", "1ED 34","ICU24"))

Я бы хотел, чтобы это выглядело так

   toyideal<-data.table(incident_no = c(1:5), location =c("2EA 17","2EA 17", "1ED 1", "1ED 23", "1ED 34", "ICU 24"))

Если бы не было числа спереди, я бы просто вычленил число и символы по одному, но, поскольку это числовой, символьный числовой, это создает проблему. Всего 1462 строки.

Дальнейшие осложнения, отделения первого этажа, такие как отделение интенсивной терапии, не имеют предыдущего номера.

Добавлено по запросу - имена, удобочитаемые

удобочитаемые имена:

additional<-data.table(incident_no = c(1:5), location =c("2EA 17","2EA 17", "1ED 1", "1ED 23", "1ED 34"),
                    human_Readable = c("Ward 2 East Bed 17","Ward 2 East Bed 17", "Ward 1 Emergency Department
                                       Bed 1", "Ward 1 Emergency Department Bed 23", "Ward 1 Emergency Department Bed 24",
                                       "Ward ICU Bed 24"))

person monkeyshines    schedule 21.07.2016    source источник
comment
Оба кода дают одинаковые значения.   -  person user2100721    schedule 21.07.2016
comment
Пожалуйста, дайте нам таблицу для сопоставления сокращений с понятными для человека именами.   -  person Tim Biegeleisen    schedule 21.07.2016


Ответы (1)


Для этого можно использовать gsub():

> gsub("(\\d*)(\\D*)\\s*(\\d*)",
       "Floor \\1 Ward \\2 and Bed \\3.",
       gsub(" ", "", "1ED 34"))

[1] "Floor 1 Ward ED and Bed 34."

Вот используемое мной регулярное выражение:

(\\d*)(\\D*)\\s*(\\d*)

Regex101

person Tim Biegeleisen    schedule 21.07.2016
comment
Это сработало бы, если бы протокол именования больничных палат был последовательным. Но это вызывает некоторые проблемы, так как названия больничных палат сами по себе не совсем согласованы, а некоторые отделения имеют странные аббревиатуры. В идеале мне нужно убедиться, что справа от последней цифры есть один пробел. Таким образом, ICU24 превращается в ICU 24. В основном необходимо быть последовательным, чтобы я мог выполнять подсчеты с помощью dplyr. - person monkeyshines; 21.07.2016
comment
Я обновил регулярное выражение, чтобы оно работало и для ICU24, т.е. в случае отсутствия предыдущего числа. Regex хорошо работает с фиксированными структурами. Если для имен действительно нет правил, регулярное выражение может быть не лучшим инструментом. - person Tim Biegeleisen; 21.07.2016
comment
Это хорошо работает: все «выбросы» находятся на первом этаже. Обеспечит ограничение регулярного выражения четко структурированными выражениями. - person monkeyshines; 21.07.2016
comment
Следующий код просто добавляет пробел перед последними числами. Он использует знак $ регулярного выражения, чтобы гарантировать, что используются только последние числовые значения. gsub("(\\d*)$"," \\1", toyraw$location) Я получаю недопустимые результаты из ваших входных данных: "2EA 17" "2EA 17" "1ED 1" "1ED 23" "1ED 34" "ICU 24" - person Choubi; 21.07.2016