r语言 - 如何使用read.table指定标题行的结尾



我有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 "

最新更新