【问题标题】:Read file and make every character in a separate column读取文件并将每个字符放在单独的列中
【发布时间】:2018-03-08 14:17:22
【问题描述】:

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

【问题讨论】:

  • 每个职位是什么意思?给我们一个数据示例以及您希望它的样子。
  • 也许使用readLines(),然后使用strsplit(myDF$myCol, split = "")。请提供示例输入文本文件和预期输出。
  • 谢谢,我试着添加一个例子。但基本上我只想为输入文件中的每个垂直位置/字符创建一个新列。
  • read.fwf 不需要输入 35000 个,只需widths = rep(1, 35000)。如果您需要计算字符数,请使用系统命令来完成,例如,system("head -n 1 yourfile | wc -m") 如果您使用的是 unix-alike。

标签: r readr


【解决方案1】:

readr::read_fwf 具有 a 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))

【讨论】:

  • 啊,完美!谢谢!
  • 别担心! :D :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 2013-10-04
  • 1970-01-01
  • 2018-04-24
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多