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

Read file and make every character in a separate column

我有一个巨大的文件(序列比对的正方形数据文件)并且想将每个位置放入一个单独的列中,但是 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.....

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

Hdvsmf
Dfhjds
Dfhjkd
Dfklds
Dkjffd
Dsfjkd
fkldsf

假设您知道有多少个字段,您可以指定一个字段宽度向量(1 个字符宽,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))