2017-11-06 22 views
0

シナリオ:セクション内のデータを含むCSVファイルがあります。CSVセクションを読み取るための簡潔な方法

[CARデータ]

MPG、CYL、DISP、HP、DRAT、重量、qsec、VS、AM、ギア、炭水化物

21,6,160,110,3.9,2.62,16.46 、0,1,4,4

21,6,160,110,3.9,2.875,17.02,0,1,4,4

22.8,4,108,93,3.85,2.32,18.61,1,1,4 、1

21.4,6,258,110,3.08,3.215,19.44,1,0,3,1

18.7,8,360,175,3.15,3.44,17.02,0,0,3,2

18.1,6,225,105,2.76,3.46 、

14.3,8,360,245,3.21,3.57,15.84,0,0,3,4 ...

20.22,1,0,3,1 [その他のもの]

書式を許してください。私はブロックの引用を少なくとも意図したデータ形式に似せるために新たな行を追加しなければならなかった。私は、下記のmtcarsを使用して再現性の例を作成し、私たちはここに引用された動機コードごとに、たとえば、私たちが望むの行をサブセット化の容易なビットをやったふり:

# Import raw data: 
data_raw <- readLines("test.txt") 

# find separation line: 
id_sep <- which(data_raw=="") 

# create ranges of both data sets: 
data_1_range <- 4:(id_sep-1) 
data_2_range <- (id_sep+4):length(data_raw) 

# using ranges and row data import it: 
data_1 <- read.csv(textConnection(data_raw[data_1_range])) 
data_2 <- read.csv(textConnection(data_raw[data_2_range])) 

this postから。言い換えれば、私たちが採用しようとしているアプローチは、データを一度に行として読み込み、必要な行を見つけてread.csvを使って "read"してdata.frameを取得することです。

さて、今年は2017年になり、私たちは世界の隙間のない世界を受け入れ、readLinesの代わりにread_linesを使用し、read.csvの代わりにread_csvを使用したいと考えています。

library(tidyverse) 

write_csv(mtcars, "mtcars_local.csv") 
# this creates an easily reproduced local file 

data_raw <- readLines("mtcars_local.csv") 
# henceforth assume we've found the desired rows and subsetted 

data_df <- read.csv(textConnection(data_raw)) 

head(data_df) 
    mpg cyl disp hp drat wt qsec vs am gear carb 
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

# whoo hoo, the above is exactly the output we want (replicating 
# the original post answer) 

data_raw_2 <- read_lines("mtcars_local.csv") 

data_df_2 <- read_csv(textConnection(data_raw_2)) 
#Error in read_connection_(con) : 
# Evaluation error: can only read from a binary connection. 

だから、read_csvは、read.csvのようにtextConnectionを取るのが好きではありません。 read_csvのドキュメント言うん:

引数:

file: Either a path to a file, a connection, or literal data 
     (either a single string or a raw vector). 

をので、質問(秒):

  1. が特定の区切り部分を得るためのきちんとしtidyverse方法はありますのCSVのかわいそうに? (ラインでの読み込みと中間ステップとしてのサブセット化は含まれません)
  2. または、各行の文字列のベクトルから、どうやってそれらを混乱させることができますか?

答えて

0

我々は、必要な改行で区切られた行を持つ単一のデータ列を作成することができる:

paste0(data_raw, collapse = "\n") [1] "mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb\n21,6,160,110,3.9,2.62,16.46,0,1,4,4\n21,6,160,110,... 

data_df_2 <- read_csv(paste0(data_raw, collapse = "\n")) 

head(data_df_2) 
# A tibble: 6 x 11 
    mpg cyl disp hp drat wt qsec vs am gear carb 
    <dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> <int> <int> <int> <int> 
1 21.0  6 160 110 3.90 2.620 16.46  0  1  4  4 
2 21.0  6 160 110 3.90 2.875 17.02  0  1  4  4 
3 22.8  4 108 93 3.85 2.320 18.61  1  1  4  1 
4 21.4  6 258 110 3.08 3.215 19.44  1  0  3  1 
5 18.7  8 360 175 3.15 3.440 17.02  0  0  3  2 
6 18.1  6 225 105 2.76 3.460 20.22  1  0  3  1 

さて、ら出来上がりを。この記事を書いて、私は答えを思いついた。しかし、ペーストの使用はきらきらしているようです。たぶん私は接着剤のパッケージについて読んで甘やかされました。しかし、CSVからデータの一部をチビに変換する「整然とした」方法はありますか?