r - 使用 read.fortran 导入 .DAT 文件时出现错误

标签 r fortran

我正在尝试导入 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 ''

我可以做什么来解决这个问题?

从本网站注册即可获得原始数据:

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

最佳答案

我从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/

相关文章:

R:简单乘法导致整数溢出

派生类型的构造函数

recursion - Fortran 递归树实现中的段错误

arrays - Fortran:哪种方法可以更快地更改数组的等级? ( reshape 与指针)

c++ - Compaq Visual Fortran 中对 DFOR.LIB 的引用

R - ggplot2 将 x Axis 值更改为非对数值

c++ - 调试可能的 Rcpp 内存泄漏时遇到问题

r - 在 R 中下载多个文件的更快方法

java - 使用 JNA 使用 native Fortran 库时查找 SIGSEGV 原因时出现问题

r - 从预处理的表达式矩阵创建 eset 对象?