Разделение строк на несколько столбцов фиксированной ширины - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь использовать str_split для разделения следующих наблюдений в конкретный формат.

"00010943900008" "00010946803119" "00010946803219" "00010946803219" "00010946803219" "00010948700007"

Я пытаюсь разбить его на разные столбцы.

Так, чтобы первое наблюдение быловыглядят примерно так:

Column x = 00

Column y = 01

Column z = 09439

Column w = 00008

Где столбец x всегда будет первыми 2 числами в наблюдении, столбец y будет следующими 2 числами, столбец z будет следующими 5 числами и столбец w будетбыть последними 5 числами

Данные

string <- c("00010943900008", "00010946803119", "00010946803219", "00010946803219", 
"00010946803219", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00010948700007", "00010948700007", 
"00010948700007", "00010948700007", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016", 
"00011820000016", "00011820000016", "00011820000016", "00011820000016"
)

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

С extract от tidyr.extract превращает каждую группу захвата регулярного выражения в отдельный столбец.Если мы не хотим сохранять исходный столбец, мы можем установить remove = TRUE (по умолчанию):

library(dplyr)
library(tidyr)

string %>%
  data.frame(string = .) %>%
  extract(string, c("x","y","z","w"), "^(\\d{2})(\\d{2})(\\d{5})(\\d{5})", remove = FALSE)

Вывод:

            string  x  y     z     w
1   00010943900008 00 01 09439 00008
2   00010946803119 00 01 09468 03119
3   00010946803219 00 01 09468 03219
4   00010946803219 00 01 09468 03219
5   00010946803219 00 01 09468 03219
6   00010948700007 00 01 09487 00007
7   00010948700007 00 01 09487 00007
8   00010948700007 00 01 09487 00007
9   00010948700007 00 01 09487 00007
10  00010948700007 00 01 09487 00007
11  00010948700007 00 01 09487 00007
12  00010948700007 00 01 09487 00007
0 голосов
/ 26 сентября 2018

Вы можете создать фрейм данных из строки, затем использовать substr (), который возвращает часть строк в зависимости от позиции:

data<- as.data.frame(string)
data$x <- substr(string,1,2)
data$y <- substr(string,3,4)
data$z <- substr(string,5,9)
data$w <- substr(string,10,14)
0 голосов
/ 26 сентября 2018

Мы можем использовать regex и read.table (Это будет работать только при одинаковом шаблоне):

> read.table(text=gsub("(\\d{2})(\\d{2})(\\d{5})(\\d{5})", "\\1,\\2,\\3,\\4", string),
             colClasses="character", sep=",", stringsAsFactors = FALSE)
    V1 V2    V3    V4
1   00 01 09439 00008
2   00 01 09468 03119
3   00 01 09468 03219
4   00 01 09468 03219
5   00 01 09468 03219
6   00 01 09487 00007
7   00 01 09487 00007
8   00 01 09487 00007
9   00 01 09487 00007
10  00 01 09487 00007
...
0 голосов
/ 26 сентября 2018

Вы можете объединить ваши данные с \n в качестве разделителя или записать их в файл, а затем использовать readr::read_fwf или read.fwf (только из файла), чтобы импортировать их в формате фиксированной ширины.Вот версия readr::read_fwf без записи на диск:

library(readr)
result = read_fwf(paste(string, collapse = "\n"),
                  col_positions = fwf_widths(c(2, 2, 5, 5), col_names = c("x", "y", "z", "w")))
head(result)
# # A tibble: 6 x 4
#   x     y     z     w
#   <chr> <chr> <chr> <chr>
# 1 00    01    09439 00008
# 2 00    01    09468 03119
# 3 00    01    09468 03219
# 4 00    01    09468 03219
# 5 00    01    09468 03219
# 6 00    01    09487 00007
...