Разделить строку по обеим сторонам числа - PullRequest
1 голос
/ 30 октября 2019

Допустим, у нас есть такие строки:

data
X3Y
X33U
Y231Z

Я хочу разбить data на три столбца first.letter, number, last.letter, поэтому в этом случае:

first.letter number last.letter
X            3      Y
X            33     U
Y            231    Z

Я мог бы извлечь первый и последний символ значения столбца, используя substr, а затем использовать регулярное выражение для извлечения числа, но это кажется действительно громоздким, есть ли более быстрый способ достичь этого?

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Один вариант - extract из tidyr

library(tidyr)
library(dplyr)
df1 %>%
    extract(data, into = c("first.letter", "number", "last.letter"),
            "^([A-Z])(\\d+)([A-Z])$")
#  first.letter number last.letter
#1            X      3           Y
#2            X     33           U
#3            Y    231           Z

Или с separate

df1 %>%
  separate(data, into = c("first.letter", "number", "last.letter"), 
         sep= "(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])")
#   first.letter number last.letter
#1            X      3           Y
#2            X     33           U
#3            Y    231           Z

Или другой вариант - strsplit, а затем rbind

do.call(rbind, strsplit(df1$data, 
        "(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])", perl = TRUE))

данные

df1 <- structure(list(data = c("X3Y", "X33U", "Y231Z")), 
   class = "data.frame", row.names = c(NA, -3L))
1 голос
/ 30 октября 2019

Использование data.table:

setDT(df)
df[, tstrsplit(sub("([0-9]+)", "_\\1_", data) , "_")]


   V1  V2 V3
1:  X   3  Y
2:  X  33  U
3:  Y 231  Z
0 голосов
/ 30 октября 2019

Идея с минимальным регулярным выражением может быть,

i1 <- gsub('\\D+', '', df1$data)
i2 <- strsplit(df1$data, '\\d+')

setNames(data.frame(t(mapply(c, i2,i1))), c('first_letter', 'second_letter', 'number'))

#  first_letter second_letter number
#1            X             Y      3
#2            X             U     33
#3            Y             Z    231
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...