Разделение символьной строки на определенный символ и сохранение этого символа - PullRequest
1 голос
/ 03 июня 2019

Я нашел ответы на этот вопрос для других языков, но не для R, поэтому я прошу прощения, если это дубликат.

Я использую функцию separate() в R, и мне любопытно, можно ли разбить столбец на два столбца при появлении определенного символа. Например:

data

    ID          Value
0011ER00      91346
0011ER46      59961
0011ER4610    53968
0011ER4620    55083
0011ER4630    51112
0011ER4640    67480
0011ER4650    45612
0011ER4660    53968

И я хотел бы разделить столбец идентификаторов, чтобы данные выглядели так:

data

Code    Region  Value
0011    ER00    91346
0011    ER46    59961
0011    ER4610  53968
0011    ER4620  55083
0011    ER4630  51112
0011    ER4640  67480
0011    ER4650  45612
0011    ER4660  53968

Я попробовал код:

data %>% 
  separate(ID, into = c("Code", "Region"), sep = "E")

но тогда я не смогу сохранить E в результате и получить:

Code    Region  Value
0011    ER00    91346
0011    R46     59961
0011    R4610   53968
0011    R4620   55083
0011    R4630   51112
0011    R4640   67480
0011    R4650   45612
0011    R4660   53968

Ответы [ 2 ]

3 голосов
/ 03 июня 2019

В качестве варианта можно использовать регулярное выражение для разделения на стыке между цифрой и символом.Здесь мы также делаем его более обобщенным, разделяя на стыке любую цифру, за которой следует буква «E»

library(dplyr)
library(tidyr)
data %>% 
   separate(ID, into = c("Code", "Region"), sep = "(?<=[0-9])(?=E)")
#  Code Region Value
#1 0011   ER00 91346
#2 0011   ER46 59961
#3 0011 ER4610 53968
#4 0011 ER4620 55083
#5 0011 ER4630 51112
#6 0011 ER4640 67480
#7 0011 ER4650 45612
#8 0011 ER4660 53968

. Или другой вариант - вставить разделитель перед , с помощью *.1006 *, а затем сделать separate

data %>%
   mutate(ID = str_replace(ID, "E", ",E")) %>% 
   separate(ID, into = c("Code", "Region"))

данных

data <- structure(list(ID = c("0011ER00", "0011ER46", "0011ER4610", "0011ER4620", 
"0011ER4630", "0011ER4640", "0011ER4650", "0011ER4660"), Value = c(91346L, 
59961L, 53968L, 55083L, 51112L, 67480L, 45612L, 53968L)), 
 class = "data.frame", row.names = c(NA, 
-8L))
1 голос
/ 03 июня 2019

Мы можем использовать extract от tidyr. Аргумент regex соответствует группам захвата (в скобках) и разделяет их на переменные, указанные в аргументе into. Обратите внимание, что количество групп захвата должно равняться количеству into имен переменных:

library(dplyr)
library(tidyr)

data %>%
  extract(ID, c("Code", "Region"), regex = "(^\\d+)([[:alpha:]]+\\d+)")

Выход:

  Code Region Value
1 0011   ER00 91346
2 0011   ER46 59961
3 0011 ER4610 53968
4 0011 ER4620 55083
5 0011 ER4630 51112
6 0011 ER4640 67480
7 0011 ER4650 45612
8 0011 ER4660 53968

Данные:

data <- structure(list(ID = structure(1:8, .Label = c("0011ER00", "0011ER46", 
"0011ER4610", "0011ER4620", "0011ER4630", "0011ER4640", "0011ER4650", 
"0011ER4660"), class = "factor"), Value = c(91346L, 59961L, 53968L, 
55083L, 51112L, 67480L, 45612L, 53968L)), class = "data.frame", row.names = c(NA, 
-8L))

extract против separate:

В отличие от использования separate (в ответе @ akrun), extract точно соответствует содержимому ваших выходных переменных, тогда как separate соответствует символу разделения (или позиции нулевой длины в случае обходных путей) , Оба действительны и имеют свои плюсы и минусы.

В зависимости от вашего варианта использования, separate, как правило, более полезно, если вы хотите разбить вашу переменную на несколько столбцов на основе некоторого разделителя, без необходимости знать, каким должно быть содержимое ваших выходных переменных.

extract более полезен, когда вы должны быть уверены, что выбираете правильные символы из вашего ввода для каждой выходной переменной.

В случае OP это на самом деле не имеет значения, поскольку он / она разделяет входные данные только на две переменные с одним «разделителем», и конкатенация выходных данных точно совпадает с входными данными.

...