2017-12-27 6 views
0

fwfを持つベクトルの行(ファイルではない)をデータフレームに読み込むにはどうすればよいですか?リテラルデータからのデータフレーム(ファイルではない)R

今は2つの方法が考えられますが、実際にはもっと良い方法が必要だと私は思っています。任意のアイデアが評価されます。

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

おかげで、それはあなたがやっているで正確に何

+0

'read_fwf(textConnectionの(literaldata)、fwf_widths(担当者(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()のドキュメント(強調鉱山)から:

リテラルデータを例とテストのために最も有用です。 少なくとも1つの新しい行がデータとして認識されなければなりません(パスの代わりに)。

+0

あなたの返事のおかげで、私はできると思われます:
'paste0(vectorOfLines、collapse = "\ n")' それは私の仕事ですが、読者のドキュメントからは、 '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))) 

助けをみんなに感謝して

関連する問題