Разбить код, номер и версию на маленькие столбцы

#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.info

4. Теперь это имеет для меня больше смысла.

Ответ №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