如何将带有fwf的行(不是文件)向量读入数据框?
现在,我可以想到两种方式,但我真的觉得必须有更好的方法。任何想法都表示赞赏。
使用data.frame()
+ substring()
。它完成了这项工作,但如果数据是“粗糙的”,我就无法轻易地概括它。 (就像下面那样的块)。我从答案中得到了它:Read fixed width text file
使用readr中的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 ...
提前致谢
答案 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)))
感谢大家的帮助和回复