【问题标题】:How to use R's read.table with an undefined number of header lines?如何将 R 的 read.table 与未定义数量的标题行一起使用?
【发布时间】:2018-06-21 22:55:16
【问题描述】:

我想使用 R read.table 函数将我的文件数据加载到 data.frame 中。数据以制表符分隔,没有丢失条目。不幸的是,我的数据之前的序言行数会有所不同。我可以很容易地将 Java/C/Perl 解决方案组合在一起;但是,我在 R 中不太确定。文件内容(在精简的模型中)看起来像:

##header stuff
##header stuff
##header stuff
#column names column names column names
data    data  data   data  data   data
data    data  data   data  data   data
data    data  data   data  data   data
...
data    data  data   data  data   data

我希望 read.table 包含“#column names 列名列名”行作为 data.frame 的列标题。

我可以手动关闭文件顶部并从标题中删除“#”;但是,我计划对数百个文件进行自动化处理。

编辑 文件中的标头信息也可以以 @ 或! 开头。

谢谢

【问题讨论】:

  • 如果您总是有相同数量的标题行要忽略,您可以使用参数skipcomment.char = "" 来忽略“标题内容”并仍然允许解析列名。
  • 谢谢莫里茨。不幸的是,我运行的每个文件的标题行数可能会发生变化。
  • 我明白了;在这种情况下,可能使用readLines 逐行读取文件,根据一些正则表达式处理删除那些“标题内容”的行,然后使用strsplit 将行拆分为列条目。
  • 我过去曾使用readLinesgrep 和正则表达式来完成此操作。但是如何做到这一点取决于您的数据集。
  • 由于注释行可以以不同的符号开头,因此在使用 Mankind_008 answer 时应在 grep 中使用 pattern = '^#|^@|^!'(以及您在文件中标识的任何其他符号),这样应该可以。

标签: r


【解决方案1】:

这应该可以帮助您:

readLines逐行读取。

grep 查找以#@! 或任何标点符号[:punct:] 开头的行

max 索引是包含列名和gsub 的行,用于在拆分为列字符向量之前删除punctuation's

此外,如果您不确定需要跳过的行是否都包含#,这是read.table 的默认注释字符。最好跳过非数据列(即包含标题行的max

log <- readLines("your_file")

column_heading_idx <- max(grep(log, pattern = "^[[:punct:]]"))   # index for header row

col_names <- gsub("[[:punct:]]", "", log[column_heading_idx])    # removed any punctuation
col_name_vec <- unlist(strsplit(col_names, split = " "))         # split into character vector

read.table("your_file", col.names = col_name_vec, 
           skip = column_heading_idx, comment.char = "")         # turned off character chr 

#   column names column.1 names.1 column.2 names.2
# 1   data  data     data    data     data    data
# 2   data  data     data    data     data    data
# 3   data  data     data    data     data    data

使用的数据:

writeLines("your_file", text = "##header stuff
##@header stuff
##@!header stuff
#@column names column names column names
data    data  data   data  data   data
data    data  data   data  data   data
data    data  data   data  data   data")

【讨论】:

  • 谢谢,这真的很有帮助。正是我所追求的。
  • 很高兴为您提供帮助。如果您有任何其他疑虑/问题,请发布。
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
相关资源
最近更新 更多