r: Чтение набора данных, в котором каждое наблюдение разбито на 2 строки? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь прочитать файл, разделенный пробелами, где каждое наблюдение прерывается на полпути новой строкой.Есть ли способ сделать read.table или fread-сканирование значений до тех пор, пока не будет заполнена вся строка?

Заголовок и первые 2 строки набора данных выглядят так:

   tsales sales margin nown nfull npart naux hoursw hourspw inv1 inv2 ssize start
       750000   4411.765         41          1          1          1     1.5357
           76   16.75596   17166.67   27177.04        170         41
      1926395   4280.878         39          2          2          3     1.5357
          192   22.49376   17166.67   27177.04        450         39

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Я читаю ваши образцы данных, это выглядит так ...

   tsales      sales   margin     nown nfull npart   naux hoursw hourspw inv1 inv2 ssize start
1  750000 4411.76500    41.00     1.00     1     1 1.5357     NA      NA   NA   NA    NA    NA
2      76   16.75596 17166.67 27177.04   170    41     NA     NA      NA   NA   NA    NA    NA
3 1926395 4280.87800    39.00     2.00     2     3 1.5357     NA      NA   NA   NA    NA    NA
4     192   22.49376 17166.67 27177.04   450    39     NA     NA      NA   NA   NA    NA    NA

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

Data=read.csv("mydata.csv")
firstData=Data[!is.na(Data$naux),]
secondData=Data[is.na(Data$naux),]
firstData$hoursw=secondData$tsales
firstData$hourspw=secondData$sales
firstData$inv1=secondData$margin
firstData$inv2=secondData$nown
firstData$ssize=secondData$nfull
firstData$start=secondData$npart
Data=firstData

Данные разбиты на 2. Нечетные строки и четные строки. Затем нечетные строки заменяются правильными значениями, указанными в данных четных чисел. Надеюсь, это поможет вам!

Окончательный вывод

> firstData
   tsales    sales margin nown nfull npart   naux hoursw  hourspw     inv1     inv2 ssize start
1  750000 4411.765     41    1     1     1 1.5357     76 16.75596 17166.67 27177.04   170    41
3 1926395 4280.878     39    2     2     3 1.5357    192 22.49376 17166.67 27177.04   450    39

> secondData
  tsales    sales   margin     nown nfull npart naux hoursw hourspw inv1 inv2 ssize start
2     76 16.75596 17166.67 27177.04   170    41   NA     NA      NA   NA   NA    NA    NA
4    192 22.49376 17166.67 27177.04   450    39   NA     NA      NA   NA   NA    NA    NA

> Data
   tsales    sales margin nown nfull npart   naux hoursw  hourspw     inv1     inv2 ssize start
1  750000 4411.765     41    1     1     1 1.5357     76 16.75596 17166.67 27177.04   170    41
3 1926395 4280.878     39    2     2     3 1.5357    192 22.49376 17166.67 27177.04   450    39
0 голосов
/ 17 мая 2018

Здесь решение data.table (я скопировал ваш пример в файл dfTest.txt).См комментарии для объяснения:

library(data.table)
#fill=TRUE fills empty cols due to irregular structure with NAs
dt=fread("dfTest.txt",header = TRUE,sep=" ",fill=TRUE)
#cols to fix
selCols=c("hoursw","hourspw","inv1","inv2","ssize","start")
#cols from which to read
otherCols=colnames(dt)[seq_along(selCols)]
#fill missing cols from leading rows and select every 2nd row afterwards
dt[,c(selCols):=shift(.SD,n=1L,type="lead"),
    .SDcols=otherCols][seq(1,nrow(dt),2),]
0 голосов
/ 17 мая 2018

Поскольку каждая строка окончательных данных разбита на две строки в вашем входе, вы можете попробовать это -

#read file
txt <- readLines("test.txt")

#extract header and remove it from data
df_header <- strsplit(txt[1], split=" ")[[1]]
txt <- txt[-1]

#merge every 2 subseqeunt lines into one to form a row of final dataframe
idx <- seq(1, length(txt), by=2)
txt[idx] <- paste(txt[idx], txt[idx+1])
txt <- txt[-(idx+1)]

#final data
df <- read.table(text=txt, col.names=df_header)

Вывод:

   tsales    sales margin nown nfull npart   naux hoursw  hourspw     inv1     inv2 ssize start
1  750000 4411.765     41    1     1     1 1.5357     76 16.75596 17166.67 27177.04   170    41
2 1926395 4280.878     39    2     2     3 1.5357    192 22.49376 17166.67 27177.04   450    39

Пример данных: test.txt содержит

tsales sales margin nown nfull npart naux hoursw hourspw inv1 inv2 ssize start
750000   4411.765         41          1          1          1     1.5357
76   16.75596   17166.67   27177.04        170         41
1926395   4280.878         39          2          2          3     1.5357
192   22.49376   17166.67   27177.04        450         39
...