r语言 - 导入 .DAT 文件 using read.fortran



我正在尝试导入 .1980年代广岛和长崎癌症相关死亡的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"))

当我这样做时,它会给我一个错误:

扫描错误(文件 = 文件, 什么 =

什么, sep = sep, quote = quote, dec = dec, : scan(( 预期为"整数",得到 ''

我该怎么做才能解决这个问题?

原始数据可在本网站注册时获得:

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

我从这里恢复了文件(注册,下载,解压缩,否则根本没有弄乱内容(。 正如@thelatemail所说,问题是最后一行中的 Ctrl-Z。 修复它的一种简单方法是读取文本,然后将除最后一行以外的所有内容写入更正的文件:

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

但是:我会小心那些建议的 Fortran 格式字符串。自述文件说

所有字段至少用一个空格分隔,以便文件可以 使用 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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(依此类推(:

剂量 11:17 T65DR 总暴露克玛。 使用的类标记是城市特定剂量组平均值。 八个剂量组分别为 0、1-9、10-49、50-99、100-199、200-299、300-399 和 400+ 厘度(rad(。...平均剂量以厘格雷给出。

因此,1-9厘射组的平均值是3.3,而不是0.33厘是有道理的......

我设法在网上找到了该文件,按照自述文件,我得到了这个结果:

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>

最新更新