我正在尝试导入 20 世纪 80 年代广岛和长崎癌症相关死亡的 .DAT 文件。我已经研究了在 R 中读取 fortran 的各种方法,但没有一个有我收到的类似错误消息。数据源为我提供了以下 Fortran 格式:
(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"))
当我这样做时,它给了我一个错误:
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : scan() expected 'an integer', got ''
我可以做什么来解决这个问题?
从本网站注册即可获得原始数据:
最佳答案
我从here恢复了文件(注册、下载、解压,完全没有弄乱内容)。正如 @thelatemail 所说,问题出在最后一行的 Ctrl-Z 上。修复此问题的一种简单方法是读取文本,然后将除最后一行之外的所有内容写入更正的文件中:
r0 <- readLines("R10CANCR.DAT")
writeLines(r0[1:(length(r0)-1)],"R10cancrfix.dat")
但是:我会小心那些建议的 Fortran 格式字符串。自述文件说
All fields are separated by at least one blank so the file can easily be read using a FORTRAN free-format read.
这表明良好的 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。如果我们相信人类对该文件的解释是正确的,那么第一个 Fortran 格式字符串就是不正确的。
自述文件中有更多证据表明这些应该是 3.3 而不是 0.33(等等):
DOSE 11:17 T65DR total exposure kerma. The classmarks used are city-specific dose group averages. The eight dose groups are 0, 1-9, 10-49, 50-99, 100-199, 200-299, 300-399, and 400+ centigray(rad). ... Average doses are given in centiGray.
因此,1-9 厘格雷组的平均值为 3.3,而不是 0.33 厘格雷,这是有道理的……
关于r - 使用 read.fortran 导入 .DAT 文件时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122259/