2017-12-27 149 views
0

如何使用fwf将行向量(不是文件)读入数据帧?来自文字数据(不是文件)的数据帧与R

现在,我可以想到两种方法,但我真的觉得应该有更好的方法。任何想法是赞赏。

  1. 使用data.frame() + substring()。它可以完成这项工作,但如果数据“不整齐”(就像下面的块一样),我不能简单地推广它。我从这里得到答案:Read fixed width text file

  2. 使用write_lines()read_fwf() from readr。我想避免写一个外部文件。实际上,read_fwf()似乎应该直接在文字数据上进行工作,但我无法使其工作:它始终将线条的字符串/矢量理解为路径。类似:

    write_lines(literaldata, "fwf_sample.txt") 
    read_fwf("fwf_sample.txt", fwf_widths(rep(8, 12))) 
    

数据样本如下下方,导致错误的代码。

literaldata <- "CHEXA  278375  2 419991 419976 418527 418528 434131 434116+   420108 420107 
CHEXA  278376  2 420028 420029 419994 419997 434168 434169+   434134 434137 
CHEXA  278377  2 419961 418516 418517 419956 434101 420119+   420118 434096 
CHEXA  278378  2 419965 418519 418520 419967 434105 420116+   420115 434107 
CHEXA  278379  2 419965 419984 420025 419971 434105 434124+   434165 434111 
CHEXA  278380  2 418521 419972 419967 418520 420114 434112+   434107 420115" 

library(readr) 
lines<-read_lines(literaldata) 
# The code above is just to get a reproducible example similar to the one I get in the data cleaning process 
read_fwf(lines, fwf_widths(rep(8, 12))) 


Error: 'CHEXA  278375  2 419991 419976 418527 418528 434131 
434116+   420108 420107CHEXA  278376 ... 

在此先感谢

+0

会'read_fwf(textConnection(literaldata),fwf_widths(REP(8,12)))'做工作? –

+0

你可以发表代码,其中'read_fwf()'错误的文字数据的路径名?因为它在你发布的数据上工作得很好。 –

回答

0

不知道它到底是什么你在干什么。功能read_fwf()适用于您的数据。

literaldata <- "CHEXA  278375  2 419991 419976 418527 418528 434131 434116+   420108 420107 
CHEXA  278376  2 420028 420029 419994 419997 434168 434169+   434134 434137 
CHEXA  278377  2 419961 418516 418517 419956 434101 420119+   420118 434096 
CHEXA  278378  2 419965 418519 418520 419967 434105 420116+   420115 434107 
CHEXA  278379  2 419965 419984 420025 419971 434105 434124+   434165 434111 
CHEXA  278380  2 418521 419972 419967 418520 420114 434112+   434107 420115" 

library(readr) 
read_fwf(literaldata, fwf_widths(rep(8, 12))) 

# # A tibble: 6 x 12 
#  X1  X2 X3  X4  X5  X6  X7  X8  X9 X10 X11 X12 
# <chr> <int> <int> <int> <int> <int> <int> <int> <int> <chr> <int> <int> 
# 1 CHEXA 278375  2 419991 419976 418527 418528 434131 434116  + 420108 420107 
# 2 CHEXA 278376  2 420028 420029 419994 419997 434168 434169  + 434134 434137 
# 3 CHEXA 278377  2 419961 418516 418517 419956 434101 420119  + 420118 434096 
# 4 CHEXA 278378  2 419965 418519 418520 419967 434105 420116  + 420115 434107 
# 5 CHEXA 278379  2 419965 419984 420025 419971 434105 434124  + 434165 434111 
# 6 CHEXA 278380  2 418521 419972 419967 418520 420114 434112  + 434107 420115 

read_fwf()(高亮矿)的文档:

文字数据是用于实施例和试验最有用的。它必须包含至少一个新行被识别为数据(而不是路径)。

+0

感谢您的回复,看起来我可以这样做:
'paste0(vectorOfLines,collapse =“\ n”)' 它为我完成了这项工作,但它仍然看起来像readr文档,我不应该需要'paste0()' 文字数据对于示例和测试非常有用。它必须包含至少一个要识别为数据(而不是路径)的新行或者是长度大于1 **的**向量。 – loistf

+0

你还没有提供完整的可重复的例子,所以我们不知道你在做什么。请阅读此:https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

0

我还不清楚为什么我以前的例子不起作用,但增加一个paste0(...,collapse = "\n")来完成这项工作。所以,类似下面的工作对我来说:

literaldata <- "CHEXA  278375  2 419991 419976 418527 418528 434131 434116+   420108 420107 
CHEXA  278376  2 420028 420029 419994 419997 434168 434169+   434134 434137 
CHEXA  278377  2 419961 418516 418517 419956 434101 420119+   420118 434096 
CHEXA  278378  2 419965 418519 418520 419967 434105 420116+   420115 434107 
CHEXA  278379  2 419965 419984 420025 419971 434105 434124+   434165 434111 
CHEXA  278380  2 418521 419972 419967 418520 420114 434112+   434107 420115" 

library(readr) 
lines<-read_lines(literaldata) 
# The code above is just to get a reproducible example similar to the one I get in the data cleaning process 
# The following gives an error 
read_fwf(lines, fwf_widths(rep(8, 12))) 
# The following give the expected result 
read_fwf(paste0(lines,collapse = "\n"), fwf_widths(rep(8, 12))) 

感谢大家的帮助和回答