读取文件并将每个字符放在单独的列中

时间:2018-03-08 14:17:23

标签: r readr

我有一个巨大的文件(序列比对的方形数据文件),并希望将每个位置放在一个单独的列中,但readr::read_delim例如不能使用空分隔符,而readr::read_fwf看来你需要指定每个位置?我有超过35000个职位。

示例输入文件:

EIGMEYRTVSGVAGPLVILDKVKGPKYQEI..... EIGMEYRTVSGVAGPLVILDKVKGPKYQEI..... EIGMEYRTVSGVAGPLVILDKVKGPKYQEI.....

输出: col1 col2 col3 col4 col5 col6.... E I G M E Y..... E I G M E Y..... E I G M E Y.....

1 个答案:

答案 0 :(得分:1)

readr::read_fwfa few different ways您可以使用col_positions参数指定字段宽度。这是一个测试文件,test.txt

Hdvsmf
Dfhjds
Dfhjkd
Dfklds
Dkjffd
Dsfjkd
fkldsf

假设您知道有多少个字段,您可以指定字段宽度的向量(1个字符宽,5倍,因为此测试文件中有5个字段):

read_fwf('test.txt', col_positions = fwf_widths(rep(1, 5)))

这可能比为每个字段指定星形和结束位置更容易。您还可以向fwf_widths提供列名称的​​字符向量,例如:

fwf_widths(rep(1, 5), paste0('col', 1:5))

如果你不知道你有多少个字段,你也可以把它作为一个列引入,然后使用tidyr::separate来提取你的列(sep参数可以带一个向量数字位置,而不仅仅是分隔符):

# a data frame with everything in one column named blah
df1 = read_csv('test.txt', col_names = 'blah')
field_count = length(df1$blah[1]) # assuming the fields are all same length!

# nb: parentheses for field_count - 1 are super important! you will spend forever debugging this if you miss it
df1 = df1 %>% separate(blah, into = paste0('col', 1:field_count), sep = 1:(field_count - 1))