来自R的文字数据(不是文件)的数据框

时间:2017-12-27 14:38:36

标签: r tidyverse readr

如何将带有fwf的行(不是文件)向量读入数据框?

现在,我可以想到两种方式,但我真的觉得必须有更好的方法。任何想法都表示赞赏。

  1. 使用data.frame() + substring()。它完成了这项工作,但如果数据是“粗糙的”,我就无法轻易地概括它。 (就像下面那样的块)。我从答案中得到了它:Read fixed width text file

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

    write_lines(literaldata, "fwf_sample.txt")
    read_fwf("fwf_sample.txt", fwf_widths(rep(8, 12)))
    
  3. 下面是一个数据示例,其中包含导致错误的代码。

        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   ...
    

    提前致谢

2 个答案:

答案 0 :(得分:0)

不确定你到底在做什么。函数var $可以很好地处理您的数据。

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 的文件(突出我的):

  

文字数据对于示例和测试最有用。它必须包含至少一个新行才能被识别为数据(而不是路径)。

答案 1 :(得分: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)))

感谢大家的帮助和回复