r语言 - 根据字符串位置将长字符串的列拆分为多个列



我有一个文本文件,我需要变成一个可用的数据帧在R.一个示例行看起来像这样:

10040 1491 32006 820085011  .007  .009  .043 -.003  .008  .036 -.031 -.036  .076  .056  .124  .093 -.112 -.091  .034  .043  .00600  .01200  .004500000000  .042333333333  .0568  .0058 -.0542 -.0304  .08625  .05425  .088857142857  .116142857143 -.072714285714 -.115571428571  .02125  .04350 8.71250 8.71825 8.729666666667 8.749500000000 8.6866 8.6722 

我想以一个包含多列的df结束,看起来像这样:

10040 1 49 1 3 2006 8 2008 50 1 1 .007 .009 .043 -.003 .008 .036 -.031 -.036 .076 .056 .124 .093 -.112 -.091  .034 .043 .00600 .01200 .004500000000 .042333333333 .0568 .0058 -.0542 -.0304 .08625  .05425 .088857142857 .116142857143 -.072714285714 -.115571428571 .02125 .04350 8.71250 8.71825 8.729666666667 8.749500000000 8.6866 8.6722 

数据没有被空格完美地分割,否则我就知道怎么做了。我知道在哪里将字符串分成多列的位置:位置5, 7, 9, 10, 12, 16, 18, 22,等,但想知道是否有一种方法可以做到这一点没有50行代码?也许可以使用tidyr的单独功能?似乎找不到任何文档或示例来解释如何使用sep参数与数字位置。

在做了一些更多的测试之后,结果证明我可以通过一个数字值列表来分割,以便在这些位置分开。

简短的例子:

testDF <- separate(grossTXT,
V1,
c('M2ID', 'SAMPLMAJ', 'B1PAGE_M2', 'B1PRSEX', 'B5PEEGDATE_MO'),
sep = c(5,7,9,10,12),
remove = TRUE,
convert = TRUE
)

这工作得很好,让我可以为每个新列命名。

使用read.fwf函数调用读取固定宽度格式文件

read.fwf(your_file, diff(c(0,5, 7, 9, 10, 12, 16, 18, 22)))

请注意,我必须使用diff,因为你有位置,文件读取宽度。

。在您的示例中,如果x是R中的文本,则可以使用:

read.fwf(textConnection(x), diff(c(0,5, 7, 9, 10, 12, 16, 18, 22)))
V1 V2 V3 V4 V5   V6 V7   V8
1 10040  1 49  1  3 2006  8 2008

最新更新