#r #regex
#r #регулярное выражение
Вопрос:
Я новичок в R.
В настоящее время я работаю над необработанными данными. Он включает в себя тысячи кодов. Мне нужно извлечь код и номер отдельно в маленькие столбцы.
У меня есть данные, как показано ниже
df <- data.frame(num = 1:3, CD = c("1999HZ0BT", "1998HQ1ML", "1964MN3JK"))
Вывод, который я хотел бы иметь
df2 <- data.frame(num = 1:3, NUMBER = c(1999, 1998, 1964), VER = c(0,1,3), CD = c("HZBT", "HQML", "MNJK"))
Спасибо за вашу помощь!
Ответ №1:
Вы могли бы использовать регулярные выражения и Map
применять их последовательно.
res <- setNames(data.frame(df$num,
Map(function(x, y) gsub(x, y, df$CD),
c("(\d{4}).*", ".*\w(\d)\w.*", "\d"),
c("\1", "\1", ""))),
c("num", "NUMBER", "VER", "CD"))
res
# num NUMBER VER CD
# 1 1 1999 0 HZBT
# 2 2 1998 1 HQML
# 3 3 1964 3 MNJK
Ответ №2:
Вы можете использовать extract
из tidyr
:
Если вы хотите извлечь данные на основе положения
library(tidyr)
df1 <- extract(df, CD, c('NUMBER', 'CD1', 'VER', 'CD2'), '(.{4})(..)(.)(..)')
Или, если вы хотите извлечь данные на основе символов и цифр
df1 <- extract(df, CD, c('NUMBER', 'CD1', 'VER', 'CD2'),
'(\d )([A-Z] )(\d )([A-Z] )')
Оба вышеперечисленных возврата
df1
# num NUMBER CD1 VER CD2
#1 1 1999 HZ 0 BT
#2 2 1998 HQ 1 ML
#3 3 1964 MN 3 JK
Вы можете комбинировать CD1
и CD2
, используя unite
unite(df1, CD, CD1, CD2, sep = "")
# num NUMBER CD VER
#1 1 1999 HZBT 0
#2 2 1998 HQML 1
#3 3 1964 MNJK 3
Комментарии:
1. Это потрясающе! Спасибо @Ronak Shah
2. Мне любопытно, как найти на основе позиции. Не могли бы вы предоставить мне какие-нибудь ресурсы, чтобы узнать об этом больше? Спасибо
3. Ну,
.
в моем ответе относятся к каждому отдельному символу в столбцеCD
. Таким образом, это означает, что первые 4 символа — этоNUMBER
, следующие 2 — этоCD1
, следующий 1 символ — этоVER
и следующие 2 какCD2
. Это хороший сайт для изучения регулярных выражений regular-expressions.info4. Теперь это имеет для меня больше смысла.
Ответ №3:
Используйте substr
:
library(dplyr)
df %>%
mutate(NUMBER = substr(CD, 1, 4),
VER = substr(CD, 7, 7),
CD = paste(substr(CD, 5, 6), substr(CD, 8, 9), sep = ""))
num CD NUMBER VER
1 1 HZBT 1999 0
2 2 HQML 1998 1
3 3 MNJK 1964 3