В R, Как разбить набор данных на столбцы на основе переменных старт / стоп позиции? - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы разделить строки набора данных на основе множества пар позиций начала / остановки в строке

. Я могу сделать это с помощью команды substr для каждой из них в произвольном порядке, но это выглядит как плохой выбор.

У меня на самом деле есть 7 наборов данных, для которых мне нужно это сделать, я надеюсь, что есть способ определения массива / вектора с парами старт / стоп, а затем передать его в substr команда.

Любое руководство по помощи было бы замечательно

# I have a datset which contains records like this

string1 <- "08103128827DP        11        513452                  131 Markett Hills Rd Coolingford XYZ 9876                                       14602012476          000000000000000000010784Y00000000000053815"
string2 <- "08203143982DP        12        611218                  12 Magicra Waters Rd Huntley XXX 9081                                           14602012476          000000000000000000010784Y00000000000038443"

# Make a dummy datset
V1 <- c(string1, string2)
myData <- data.frame(V1)
head(myData)

# I would like to split into distinct fields for each row of the typically large dataset that I have
fld_1 <- substr(myData, 0, 3)
fld_2 <- substr(myData, 4, 11)
fld_3 <- substr(myData, 12, 16)
fld_4 <- as.numeric(substr(myData, 187, 198))/100

# The field widths vary, as do the data types

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Поля, кажется, разделены 2 или более пробелами, в то время как одиночные пробелы находятся внутри полей, поэтому замените любой цикл из 2 или более пробелов символом табуляции, а затем считайте его разделителем табуляции:

read.delim(text = gsub("  +", "\t", as.character(myData$V1)), 
  as.is = TRUE, header = FALSE)
0 голосов
/ 10 февраля 2020

Если у вас есть точные начальные и конечные позиции:

# (0) Make a dummy dataset
string1 <- "08103128827DP        11        513452                  131 Markett Hills Rd Coolingford XYZ 9876                                       14602012476          000000000000000000010784Y00000000000053815"
string2 <- "08203143982DP        12        611218                  12 Magicra Waters Rd Huntley XXX 9081                                           14602012476          000000000000000000010784Y00000000000038443"
V1 <- c(string1, string2)

# (1) Define positions and variable names
pos <- list("Var 1" = c(0, 13),
            "Var 2" = c(22, 23),
            "Var 3" = c(32, 37))

# (2) Extract variables as text
vars <- lapply(pos, function(x) {
  substr(V1, x[1], x[2])
})

# (3) Assign classes
class(vars[["Var 2"]]) <- "numeric"
class(vars[["Var 3"]]) <- "numeric"
...