如何将R的read.table与未定义的标题行一起使用?

时间:2018-06-21 22:55:17

标签: r

我想使用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的列标题。

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

修改 文件中的标题信息也可以以@或!开头。

谢谢

1 个答案:

答案 0 :(得分:2)

这应该可以帮助您:

readLines 逐行读取。

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

max index是包含列名和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")