【问题标题】:data frame from literal data (not a file) with R来自文字数据(不是文件)的数据帧与 R
【发布时间】:2018-06-08 04:58:50
【问题描述】:

如何使用 fwf 将行向量(不是文件)读入数据框中?

目前,我可以想到两种方法,但我真的觉得必须有更好的方法。任何想法都值得赞赏。

  1. 使用data.frame() + substring()。它可以完成这项工作,但是如果数据“参差不齐”(就是这样,如下所示的块),我将无法轻松概括它。我是从这里的答案中得到的:Read fixed width text file

  2. 使用来自阅读器的write_lines()read_fwf()。我想避免编写外部文件。实际上,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   ...

提前致谢

【问题讨论】:

  • read_fwf(textConnection(literaldata), fwf_widths(rep(8,12))) 会做这项工作吗?
  • 你能贴出read_fwf() 将文字数据误认为路径名的代码吗?因为它适用于您发布的数据。

标签: r tidyverse readr


【解决方案1】:

不确定你到底在做什么。函数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() 的文档(突出显示我的):

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

【讨论】:

  • 感谢您的回复,看来我可以做到:
    'paste0(vectorOfLines,collapse="\n")' 它为我完成了这项工作,但从我不应该需要'paste0()' 的readr 文档 文字数据对于示例和测试最有用。它必须包含至少一个新行才能被识别为数据(而不是路径)或者是一个长度大于 1 的向量
  • 你还没有提供一个完整的可重现的例子,所以我们不知道你在做什么。请阅读:stackoverflow.com/questions/5963269/…
【解决方案2】:

我仍然不清楚为什么我之前的示例不起作用,但添加 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)))

感谢大家的帮助和回复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多