Я получаю сообщение об ошибке при импорте файла .DAT с использованием read.fortran - PullRequest
3 голосов
/ 08 февраля 2020

Я пытаюсь импортировать файл .DAT о смертях, связанных с раком, в Хиросиме и Нагасаки с 1980-х годов. Я рассмотрел различные способы чтения фортрана в R, но ни у одного из них не было похожих сообщений об ошибках, которые я получаю. Источник данных предоставил мне форматы Фортрана:

(2I3, I4, F7.1, I5, I4, F10.2,26I4)

или

(2F3. 0, F4.0, F7.0, F5.0, F4.0, F10.0,26F4.0).

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

read.fortran("R10CANCR.DAT", c("2I3","I4","F7.1","I5","I4","F10.2","26I4"))

, когда я это делаю, выдает ошибку:

Ошибка сканирования (файл = файл, что = что, sep = sep, quote = quote, dec = de c,: scan () ожидал 'целое число', получил ''

Что я могу сделать, чтобы это исправить?

Исходные данные доступны при регистрации с этого сайта:

https://www.rerf.or.jp/en/library/data-en/lss10cm/

Ответы [ 2 ]

4 голосов
/ 08 февраля 2020

Я восстановил файл из здесь (зарегистрирован, загружен, разархивирован, иначе не связывался с содержимым). Как говорит @thelatemail, проблема заключается в Ctrl-Z в последней строке. Один простой способ исправить это - прочитать текст, а затем записать все, кроме последней строки, в исправленный файл:

r0 <- readLines("R10CANCR.DAT")
writeLines(r0[1:(length(r0)-1)],"R10cancrfix.dat")

Однако : я был бы осторожен с теми, кто предложил Fortran формат строки README говорит:

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

, что говорит о том, что read.table() должно работать. Когда я попытался это сделать, я обнаружил расхождения между результатами read.fortran() и read.table() (для одной из строк формата, а не другой), и в следующем примере предполагается, что одна из предложенных строк формата не соответствует пробелу в файл данных.

r <- read.table("r10cancrfix.dat")
fstr <- c("2I3","I4","F7.1","I5","I4","F10.2","26I4")
fstr2 <- c("2F3.0","F4.0","F7.0","F5.0","F4.0","F10.0","26F4.0") 
r2 <- read.fortran("r10cancrfix.dat",fstr)
r3 <- read.fortran("r10cancrfix.dat",fstr2)
all.equal(r,r3) ## TRUE
all.equal(r,r2)
## [1] "Component “V4”: Mean relative difference: 0.9" 
## [2] "Component “V7”: Mean relative difference: 0.99"

Что происходит?

r$V4[9]  ## first non-zero value in this column
## [1] 3.3
r2$V4[9]
## [1] 0.33

Вот что содержит исходный файл:

cat(r0[9])

0 0 5 3.3 52 1 6140.30 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Четвертое значение равно 3,3, а не 0,33. Если мы считаем, что интерпретация этого файла человеком верна, то первая строка формата Фортрана неверна.

Дополнительные доказательства того, что они должны быть 3,3, а не 0,33 (и т. Д.), Находятся в файле README. :

ДОЗА 11:17 T65DR общая экспозиция кермы. Используемые классы являются указанными для города c средними по группам доз. Восемь групп доз составляют 0, 1-9, 10-49, 50-99, 100-199, 200-299, 300-399 и 400+ по Цельсию (рад). ... Средние дозы даны в centiGray.

Так что имеет смысл, что среднее значение для 1-9-градусной группы будет 3,3, а не 0,33-градусного ...

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

Мне удалось найти файл в Интернете, и после чтения я получаю следующий результат:

df <- read.fortran("~/R10CANCR.DAT", 
                   c("2F3.0", "F4.0", "F7.0", "F5.0", "F4.0", "F10.0", "26F4.0"))
names(df) <-  c("CITY", "SEX", "AGEATB", "DOSE", "TIME", "INDEX", "PYR", "ALLDEATH", 
                "ALLDIS", "ALLNEO", "ALLMAL", "LEUK", "NONLEUK", "DIGEST", "ESOPH", 
                "STOMACH", "COLON", "RECTUM", "LIVER", "GALLBLDR", "PANCREAS", 
                "OTHRDIG", "RESP", "LUNG", "FBREAST", "FGENITAL", "CERVIX", "OVARY", 
                "PROSTATE", "URINARY", "LYMPHOMA", "MYELOMA", "OTHRCA")

dplyr::as_tibble(df)
# A tibble: 1,280 x 33
    CITY   SEX AGEATB  DOSE  TIME INDEX    PYR ALLDEATH ALLDIS ALLNEO ALLMAL  LEUK NONLEUK DIGEST ESOPH
   <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>    <dbl>  <dbl>  <dbl>  <dbl> <dbl>   <dbl>  <dbl> <dbl>
 1     0     0      5   0      52     1 10979.        9      7      1      1     1       0      0     0
 2     0     0      5   0      56     2 10287.       12      4      0      0     0       0      0     0
 3     0     0      5   0      60     3 10223        17      7      0      0     0       0      0     0
 4     0     0      5   0      64     4 10168.       13      6      0      0     0       0      0     0
 5     0     0      5   0      68     5 10119.       13      7      2      2     1       1      1     0
 6     0     0      5   0      72     6 10061.       13      9      2      2     1       1      1     0
 7     0     0      5   0      76     7  9995.       16     13      3      3     0       3      2     0
 8     0     0      5   0      80     8  9924.       16     13      1      1     0       1      0     0
 9     0     0      5   3.3    52     1  6140.        5      3      0      0     0       0      0     0
10     0     0      5   3.3    56     2  5750.       10      4      0      0     0       0      0     0
# ... with 1,270 more rows, and 18 more variables: STOMACH <dbl>, COLON <dbl>, RECTUM <dbl>,
#   LIVER <dbl>, GALLBLDR <dbl>, PANCREAS <dbl>, OTHRDIG <dbl>, RESP <dbl>, LUNG <dbl>, FBREAST <dbl>,
#   FGENITAL <dbl>, CERVIX <dbl>, OVARY <dbl>, PROSTATE <dbl>, URINARY <dbl>, LYMPHOMA <dbl>,
#   MYELOMA <dbl>, OTHRCA <dbl>
...