2017-05-29 9 views
1

抽出するデータの2つのセクションを繰り返して、次のファイルをインポートしようとしています。最初のセットは未使用ヘッダー(5行目)と "ES"行目5で始まる実ヘッダーで始まります。データの次のセクションは、未使用ヘッダー(13行目)と "LU"(14行目)以降の変数名で始まる実際のヘッダーで始まります。これらのファイルの多くがあり、それぞれに異なる長さのEUセクションとLSセクションがあります。私はデータフレームを分離するためにLSとEUデータを抽出する必要があります。残念なことに、ファイルはセンサーアレイの「現状のまま」であり、私はそれを変更することはできず、すべてこれをExcelでやっていない方がいいかもしれないが、そうしなければならないかもしれない。実際のファイルには、EUとLSのセットごとに数百の行が存在することがあります。CSVの複数の範囲とヘッダーをインポート

EUセクションのインデックスに次のコードを適用しようとしましたが、それを抽出してクリーンアップしてLSセクションで同じことをしていましたが、これも動作しませんでした。理由の一部は、EUが両方のヘッダー行にあったことです。私はperlスクリプトを使ってコードを見たことがありますが、その言語を使ったことはありません。

lns = readLines("lake1.txt") 
idx = grepl("EU", lns) 
df = read.table(text=lns[!idx]) 
wd = diff(c(which(idx), length(idx) + 1)) - 1 
df$label = rep(lns[idx], wd) 

私はCSVを追加するための最良の方法は、たとえばファイル確認されませんでしたが、ここにある...

Garbage Text 1,,,,,,,, 
Garbage Text 2,,,,,,,, 
Garbage Text 3,,,,,,,, 
,,,,,,,, 
INTTIME ('sec'),SAMPLE ('sec'),ES_DARK ('uW/cm^2/nm'),ES_DARK ('uW/cm^2/nm'),ES_DARK ('uW/cm^2/nm'),CHECK (''),DATETAG (NONE),TIMETAG2 (NONE),POSFRAME (NONE) 
ES,DELAY,344.83,348.23,351.62,SUM,NONE,NONE,COUNTS 
0.032,0,0.35441789,-0.00060208,0.10290995,87,2017015,10:42:39,1 
0.032,0,-0.36023974,-0.22242269,-0.09639,109,2017015,10:42:40,10 
0.032,0,0.07552711,0.01524224,-0.16756855,91,2017015,10:42:48,41 
,,,,,,,,11304 
,,,,,,,,11312 
,,,,,,,, 
INTTIME ('sec'),SAMPLE ('sec'),LU ('uW/cm^2/nm/sr'),LU ('uW/cm^2/nm/sr'),LU ('uW/cm^2/nm/sr'),CHECK (''),DATETAG (NONE),TIMETAG2 (NONE),POSFRAME (NONE) 
LU,DELAY,344.37,347.75,351.13,SUM,NONE,NONE,COUNTS 
0.032,0,0.02288441,0.02891912,0.03595322,53,2017015,10:42:38,2 
0.032,0,-0.00014323,0.00024047,0.00001585,212,2017015,10:42:38,6 
0.032,0,0.00114258,0.00091736,-0.0000495,16,2017015,10:42:39,9 
0.032,0,0.00020744,0.0004186,0.00027721,118,2017015,10:42:40,16 
,,,,,,,,11310 
,,,,,,,, 
INTTIME ('sec'),SAMPLE ('sec'),ES ('uW/cm^2/nm'),ES ('uW/cm^2/nm'),ES ('uW/cm^2/nm'),CHECK (''),DATETAG (NONE),TIMETAG2 (NONE),POSFRAME (NONE) 
ES,DELAY,344.83,348.23,351.62,SUM,NONE,NONE,COUNTS 
0.032,0,56.7600789,59.43147464,62.83968564,186,2017015,10:42:38,3 
0.032,0,56.27202003,59.52654061,62.86815706,29,2017015,10:42:38,4 
,,,,,,,,11309 
,,,,,,,,11311 
,,,,,,,, 
INTTIME ('sec'),SAMPLE ('sec'),LU ('uW/cm^2/nm/sr'),LU ('uW/cm^2/nm/sr'),LU ('uW/cm^2/nm/sr'),CHECK (''),DATETAG (NONE),TIMETAG2 (NONE),POSFRAME (NONE) 
LU,DELAY,344.37,347.75,351.13,SUM,NONE,NONE,COUNTS 
0.032,0,-0.00011611,-0.00039544,-0.00014584,3,2017015,10:42:42,20 
0.032,0,-0.00032394,-0.00020563,-0.00020383,229,2017015,10:42:46,39 

これは、二つのデータフレームが最後にどのように見えるかです:

データフレーム1

ES,DELAY,344.83,348.23,351.62,SUM,NONE,NONE,COUNTS 
0.032,0,0.35441789,-0.00060208,0.10290995,87,2017015,10:42:39,1 
0.032,0,-0.36023974,-0.22242269,-0.09639,109,2017015,10:42:40,10 
0.032,0,0.07552711,0.01524224,-0.16756855,91,2017015,10:42:48,41 
0.032,0,56.7600789,59.43147464,62.83968564,186,2017015,10:42:38,3 
0.032,0,56.27202003,59.52654061,62.86815706,29,2017015,10:42:38,4 

DATAFRAME 2

LU,DELAY,344.37,347.75,351.13,SUM,NONE,NONE,COUNTS 
0.032,0,0.02288441,0.02891912,0.03595322,53,2017015,10:42:38,2 
0.032,0,-0.00014323,0.00024047,0.00001585,212,2017015,10:42:38,6 
0.032,0,0.00114258,0.00091736,-0.0000495,16,2017015,10:42:39,9 
0.032,0,0.00020744,0.0004186,0.00027721,118,2017015,10:42:40,16 
0.032,0,-0.00011611,-0.00039544,-0.00014584,3,2017015,10:42:42,20 
0.032,0,-0.00032394,-0.00020563,-0.00020383,229,2017015,10:42:46,39 
+0

私はあなたの出力例になったか理解していません。なぜ '9'行に' 9'行が含まれていなかったのですか?出力 'LU'ファイルに' 0.512'値と最後の行がどこに来るのですか? – austensen

+0

出力を短くしすぎて長すぎることはありませんでした。申し訳ありませんが、私はそれを追加することができますが、投稿の長さを制限したいと思っていました。 –

+0

これは問題ありません。私が理解できることを確認しようとしています。また、10行11行( ',,,,,,, 11309') – austensen

答えて

1

これはtidyverseツールでこれを解決できる方法です。文字列操作のためのデータフレーム操作

stringrため

読み込み/書き込みのcsvファイル用readr

dplyr

library(readr) 
library(dplyr) 
library(stringr) 

df_1 <- read_csv("test1.csv", col_names = FALSE, col_types = cols(.default = "c"), skip = 3) 

最初に欠落しているすべての値を持つ行を削除、またはすべてが、最後の行、および余分なヘッダーを持つ行が含まれます。

はその後NAそうでない場合は、ESまたはLU値を持つ新しい列を作成し、それらの値を下に埋めるためにtidyr::fillを使用しています。

NONEで2つの列をDATETIMEに変更してください。後で同じ名前の列が2つ必要ないためです。あなたはそれらの列ヘッダー行を削除し、書き込み、列名として最初の行を使用し、その後、新しいgrp列を削除し、その後、ちょうどそれらのレコードをフィルタリングすることができESLUのそれぞれについて、今

df_2 <- df_1 %>% 
    filter(!is.na(X1), !str_detect(X1, "INTTIME")) %>% 
    mutate(grp = if_else(X1 %in% c("ES", "LU"), X1, NA_character_)) %>% 
    tidyr::fill(grp, .direction = "down") %>% 
    mutate(X7 = str_replace(X7, "NONE", "DATE"), 
     X8 = str_replace(X8, "NONE", "TIME")) 

df_2 

#> # A tibble: 15 x 10 
#>  X1 X2   X3   X4   X5 X6  X7  X8  X9 grp 
#> * <chr> <chr>  <chr>  <chr>  <chr> <chr> <chr> <chr> <chr> <chr> 
#> 1 ES DELAY  344.83  348.23  351.62 SUM DATE  TIME COUNTS ES 
#> 2 0.032  0 0.35441789 -0.00060208 0.10290995 87 2017015 10:42:39  1 ES 
#> 3 0.032  0 -0.36023974 -0.22242269 -0.09639 109 2017015 10:42:40  10 ES 
#> 4 0.032  0 0.07552711 0.01524224 -0.16756855 91 2017015 10:42:48  41 ES 
#> 5 LU DELAY  344.37  347.75  351.13 SUM DATE  TIME COUNTS LU 
#> 6 0.032  0 0.02288441 0.02891912 0.03595322 53 2017015 10:42:38  2 LU 
#> 7 0.032  0 -0.00014323 0.00024047 0.00001585 212 2017015 10:42:38  6 LU 
#> 8 0.032  0 0.00114258 0.00091736 -0.0000495 16 2017015 10:42:39  9 LU 
#> 9 0.032  0 0.00020744 0.0004186 0.00027721 118 2017015 10:42:40  16 LU 
#> 10 ES DELAY  344.83  348.23  351.62 SUM DATE  TIME COUNTS ES 
#> 11 0.032  0 56.7600789 59.43147464 62.83968564 186 2017015 10:42:38  3 ES 
#> 12 0.032  0 56.27202003 59.52654061 62.86815706 29 2017015 10:42:38  4 ES 
#> 13 LU DELAY  344.37  347.75  351.13 SUM DATE  TIME COUNTS LU 
#> 14 0.032  0 -0.00011611 -0.00039544 -0.00014584  3 2017015 10:42:42  20 LU 
#> 15 0.032  0 -0.00032394 -0.00020563 -0.00020383 229 2017015 10:42:46  39 LU 

新しいクリーンアップされたcsvファイルにコピーします。

df_es <- df_2 %>% 
    filter(grp == "ES") %>% 
    select(-grp) %>% 
    purrr::set_names(., .[1,]) %>% 
    filter(ES != "ES") %>% 
    write_csv("ES.csv") 

df_es 

#> # A tibble: 5 x 9 
#>  ES DELAY `344.83` `348.23` `351.62` SUM DATE  TIME COUNTS 
#> * <chr> <chr>  <chr>  <chr>  <chr> <chr> <chr> <chr> <chr> 
#> 1 0.032  0 0.35441789 -0.00060208 0.10290995 87 2017015 10:42:39  1 
#> 2 0.032  0 -0.36023974 -0.22242269 -0.09639 109 2017015 10:42:40  10 
#> 3 0.032  0 0.07552711 0.01524224 -0.16756855 91 2017015 10:42:48  41 
#> 4 0.032  0 56.7600789 59.43147464 62.83968564 186 2017015 10:42:38  3 
#> 5 0.032  0 56.27202003 59.52654061 62.86815706 29 2017015 10:42:38  4 


df_lu <- df_2 %>% 
    filter(grp == "LU") %>% 
    select(-grp) %>% 
    set_names(., .[1,]) %>% 
    filter(LU != "LU") %>% 
    write_csv("LU.csv") 

df_lu 

#> # A tibble: 6 x 9 
#>  LU DELAY `344.37` `347.75` `351.13` SUM DATE  TIME COUNTS 
#> * <chr> <chr>  <chr>  <chr>  <chr> <chr> <chr> <chr> <chr> 
#> 1 0.032  0 0.02288441 0.02891912 0.03595322 53 2017015 10:42:38  2 
#> 2 0.032  0 -0.00014323 0.00024047 0.00001585 212 2017015 10:42:38  6 
#> 3 0.032  0 0.00114258 0.00091736 -0.0000495 16 2017015 10:42:39  9 
#> 4 0.032  0 0.00020744 0.0004186 0.00027721 118 2017015 10:42:40  16 
#> 5 0.032  0 -0.00011611 -0.00039544 -0.00014584  3 2017015 10:42:42  20 
#> 6 0.032  0 -0.00032394 -0.00020563 -0.00020383 229 2017015 10:42:46  39 
+0

それは私がまだ@austensenで見た最もエレガントな解決策です。 ありがとうございます。私はこの方法で整頓コードを見たことがありませんでしたし、あなたがこれをどうやってやっているのかを理解し、将来適用するためにはうまくいくでしょう。 ちょうど私がRをうまく使っていると思ったとき、私は本当に知っていることがほとんどわかりませんでした。 –

+1

@BillPerryそれを聞いてうれしがってくれて助かりました!ええ、整頓パッケージは本当に素晴らしいです。あなたが[tidyverse.org](http://tidyverse.org/)を閲覧することに加えて、もっと学びたいなら、[R for Data Science](http://r4ds.had.co)を読むことをお勧めします.nz/introduction.html) – austensen

関連する問題