我有一个文本文件,我需要变成一个可用的数据帧在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