我有ASCII文件,其中的数据用$
符号分隔。
数据中有 23 列,第一行是列名,但行尾不一致,这导致 R 通过相对于其列向左移动数据来不正确地导入数据。
标题行:
ISR$CASE$I_F_COD$FOLL_SEQ$IMAGE$EVENT_DT$MFR_DT$FDA_DT$REPT_COD$MFR_NUM$MFR_SNDR$AGE$AGE_COD$GNDR_COD$E_SUB$WT$WT_COD$REPT_DT$OCCP_COD$DEATH_DT$TO_MFR$CONFID$REPORTER_COUNTRY
它不以$
符号结尾。
第一行:
7215577$8135839$I$$7215577-0$20101011$$20110104$DIR$$$67$YR$F$N$220$LBS$20110102$CN$$N$Y$UNITED STATES$
它确实以$
符号结尾。
我的导入命令:
read.table(filename, header=TRUE, sep="$", comment.char="", header=TRUE, quote="")
我的猜测是,行尾之间的不一致导致R认为记录比标题多一列,从而使第一列成为row.names列,这是不正确的。添加规范row.names=NULL
并不能解决问题。
如果我在文件中手动添加 $ 符号,问题就解决了,但这是不可行的,因为问题发生在数百个文件中。有没有办法指定如何读取标题行?我还有其他选择吗?
附加信息:标题在不同的文件中发生变化,所以我无法设置自己的列名向量
创建一个虚拟测试文件:
cat("ISR$CASE$I_F_COD$FOLL_SEQ$IMAGE$EVENT_DT$MFR_DT$FDA_DT$REPT_COD$MFR_NUM$MFR_SNDR$AGE$AGE_COD$GNDR_COD$E_SUB$WT$WT_COD$REPT_DT$OCCP_COD$DEATH_DT$TO_MFR$CONFID$REPORTER_COUNTRYn7215577$8135839$I$$7215577-0$20101011$$20110104$DIR$$$67$YR$F$N$220$LBS$20110102$CN$$N$Y$UNITED STATES$",
file="deleteme.txt",
"n")
使用gsub
的解决方案:
首先将文件作为文本读取,然后编辑其内容:
file_path <- "deleteme.txt"
fh <- file(file_path)
file_content <- readLines(fh)
close(fh)
在标题行的末尾添加一个$
:
file_content[1] <- paste0(file_content, "$")
或者从所有行的末尾删除$
:
file_content <- gsub("\$$", "", file_content)
然后我们将固定文件写回磁盘:
cat(paste0(file_content, collapse="n"), file=paste0("fixed_", file_path), "n")
现在我们可以读取文件:
df <- read.table(paste0("fixed_", file_path), header=TRUE, sep="$", comment.char="", quote="", stringsAsFactors=FALSE)
并获得所需的结构:
str(df)
'data.frame': 1 obs. of 23 variables:
$ ISR : int 7215577
$ CASE : int 8135839
$ I_F_COD : chr "I"
$ FOLL_SEQ : logi NA
$ IMAGE : chr "7215577-0"
$ EVENT_DT : int 20101011
$ MFR_DT : logi NA
$ FDA_DT : int 20110104
$ REPT_COD : chr "DIR"
$ MFR_NUM : logi NA
$ MFR_SNDR : logi NA
$ AGE : int 67
$ AGE_COD : chr "YR"
$ GNDR_COD : logi FALSE
$ E_SUB : chr "N"
$ WT : int 220
$ WT_COD : chr "LBS"
$ REPT_DT : int 20110102
$ OCCP_COD : chr "CN"
$ DEATH_DT : logi NA
$ TO_MFR : chr "N"
$ CONFID : chr "Y"
$ REPORTER_COUNTRY: chr "UNITED STATES "