R read.table: как избежать ошибки из-за несоответствия столбцов - PullRequest
0 голосов
/ 05 февраля 2020

Я делюсь здесь текстовым файлом, который нужно прочитать в R

https://www.filehosting.org/file/details/846022/PLT_PERIOD_ALL_175_P98.PLT

Это то, что я сделал до сих пор

fname<-'PLT_PERIOD_ALL_175_P98.PLT'

rt0<-read.table(fname, skip=8, header = FALSE,
           stringsAsFactors = FALSE)
##Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  : 
##               line 84 did not have 10 elements

rt1<-read.table(fname, skip=8, header = FALSE, 
               stringsAsFactors = FALSE, fill=TRUE)
# this is messing up the last two columns by row 84

rt2<-read.table(fname, skip=8, header = FALSE, 
               flush = TRUE, stringsAsFactors = FALSE, fill=TRUE)
# this is skipping one column

rt3<-read.table(fname, skip=8, header = FALSE, sep='\t',
               flush = TRUE, stringsAsFactors = FALSE, fill=TRUE)
# this is reading all in one column

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Нет разделителей. Таким образом, способ справиться с этим - использовать файл fwf logi c. В тексте преамбулы было 9 строк, но одна из них была разбита нестандартным переводом строки. Восьмая строка имеет подчеркивания, которые определяют расположение столбцов. 84-я строка данных (и последующие строки) содержит записи в столбце "NET ID", которых не было в строках 7-9 выше.

*        X             Y      AVERAGE CONC    ZELEV    ZHILL    ZFLAG    AVE     GRP       RANK     NET ID   DATE(CONC)
* ____________  ____________  ____________   ______   ______   ______  ______  ________  ________  ________  ________
  739950.40000 5083641.40000      12.01732   124.31  1564.68     0.00    1-HR  ALL       175TH               19120324
  ---snipped lines------

Это то, что вы видите после read.table( ..., fill=TRUE) операция с добавленными данными в 10-м столбце со значением «CAR1»:

83    739277.6 5083387  0.78225 123.46 1564.68  0 1-HR ALL 175TH 19010108
84    739061.1 5082586  0.34595 122.50 1564.70  0 1-HR ALL 175TH     CAR1
85  19052321.0      NA       NA     NA      NA NA                        
86    739161.1 5082586  0.39795 122.00 1564.70  0 1-HR ALL 175TH     CAR1

Вот прием для создания «линейки» для определения позиций столбцов. Вы можете вычислить ширину этих столбцов подчеркивания (включая 2 позиции в начале и 3 пробела позиции, используя этот вывод:

rt1<-readLines("~/Downloads/PLT_PERIOD_ALL_175_P98.PLT",n=9 )  # first 8 lines
rt2 <- paste0( rep(c(1:9,0),12), collapse="")     # one's place ruler
rt2[2] <- paste0( tail( rep( c(0:9, 0:1) ,each=10),-1 ),collapse="") # ten's place ruler

> rt2
[1] "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
[2] "00000000011111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111111111" 
> rt1[8]
[1] "* ____________  ____________  ____________   ______   ______   ______  ______  ________  ________  ________  ________"

А затем прочитайте:

> ?read.fwf

Вы читать все данные, используя ширину.

0 голосов
/ 07 февраля 2020

здесь некоторые из моих многочисленных неудачных попыток прочитать первые два столбца (просто для продолжения с более простым подмножеством) второй столбец (не говоря уже о других)

...