【问题标题】:How to specify end of header line with read.table如何使用 read.table 指定标题行的结尾
【发布时间】:2020-02-11 12:03:52
【问题描述】:

我有 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 并不能解决问题。

如果我在文件中手动添加 $ 符号,问题就解决了,但这是不可行的,因为问题出现在数百个文件中。有没有办法指定如何读取标题行?我有其他选择吗?

附加信息:不同文件的标题会发生变化,因此我无法设置自己的列名向量

【问题讨论】:

    标签: r import header


    【解决方案1】:

    创建一个虚拟测试文件:

    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_COUNTRY\n7215577$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 "
    

    【讨论】:

    • 谢谢。我很好奇是否有直接通过 read.table 的解决方案,而不是使用 gsub 或 paste 等其他函数,但我想我必须这样做。
    • 可能还有其他解决方案。但至少,这种解决方案的优点是固定文件具有“正常”结构......
    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多