我有一个巨大的文件(序列比对的方形数据文件),并希望将每个位置放在一个单独的列中,但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.....
答案 0 :(得分:1)
readr::read_fwf
有a 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))