拆分字符串行并创建数据框

时间:2015-01-07 09:16:40

标签: r string

我通过readLines读取的文本文件中有一小部分数据。该文件包含#这样的字符,我认为这是read.table无法读取的原因。这是输入的前五行:

files<-c("\trfinal\t\t", "eq1\t\t\t", "0.ster6\t1.00\t(1.00,1.00)\t.", 
     "1.ster6\t0.65\t(0.47,0.88)\t0.006", "0.parkinson\t1.00\t(1.00,1.00)\t.", 
     "1.ster6#0.parkinson\t1.00\t(1.00,1.00)\t.")

\t表示字符串之间的空格。我想拆分这些文本行并将它们放入一个4列网格(数据框)。

我尝试了strsplit(files, "[\\t]"),但它并没有真正做到这一点。有什么帮助吗?

2 个答案:

答案 0 :(得分:8)

您可以在#中禁用comment.char read.table的处理:

read.table(text=files, sep='\t', comment.char="")
#                    V1     V2          V3    V4
# 1                     rfinal
# 2                 eq1
# 3             0.ster6   1.00 (1.00,1.00)     .
# 4             1.ster6   0.65 (0.47,0.88) 0.006
# 5         0.parkinson   1.00 (1.00,1.00)     .
# 6 1.ster6#0.parkinson   1.00 (1.00,1.00)     .

答案 1 :(得分:7)

如果"\t"仅表示制表符分隔符,请尝试read.delim

read.delim(text = files)
#                     X rfinal         X.1   X.2
# 1                 eq1     NA                  
# 2             0.ster6   1.00 (1.00,1.00)     .
# 3             1.ster6   0.65 (0.47,0.88) 0.006
# 4         0.parkinson   1.00 (1.00,1.00)     .
# 5 1.ster6#0.parkinson   1.00 (1.00,1.00)     .

您还可以考虑stringi包。在这里,我将"\t"视为固定模式:

library(stringi)
stri_split_fixed(files, "\t", simplify = TRUE)
#      [,1]                  [,2]     [,3]          [,4]   
# [1,] ""                    "rfinal" ""            ""     
# [2,] "eq1"                 ""       ""            ""     
# [3,] "0.ster6"             "1.00"   "(1.00,1.00)" "."    
# [4,] "1.ster6"             "0.65"   "(0.47,0.88)" "0.006"
# [5,] "0.parkinson"         "1.00"   "(1.00,1.00)" "."    
# [6,] "1.ster6#0.parkinson" "1.00"   "(1.00,1.00)" "."   

总的来说,目前尚不清楚什么应该被视为标题等等,并且最好实现@musically_ut关于使用comment.char并尝试在源头解决问题的建议。