2017-05-16 3 views
1

Als Anfänger möchte ich Sie fragen, welche ist die elegantere/effektivere Weg, große .csv Daten zu reinigen: Ich habe zwei Arten von Lösungen (gefunden mit help(), hier und in der Literatur) aber ich bin mir nicht sicher, ob es etwas Besseres gibt (zB mit Loops?) kannst du mir vorschlagen.Datenreinigung mit read.csv

Mein (nicht sehr R-friendly) CSV-Daten (523 Zeilen, 47 Spalten, hier nur der Anfang):

;;; 
;;; 
;;; 
Name;#1;#2;#3 
Correction;;;   
Date;19.09.2016;19.09.2016;19.09.2016 
Time;12:05:03;12:06:01;12:07:00 
T_int [ms];806;800;884 
Ev [lx];1,31E+03;1,35E+03;1,27E+03 
Ee [W/sqm] (380-780nm);4,22E+00;4,38E+00;4,17E+00 
;;; 
;;; 
Chrom. Coord.;;;   
x;0,3657;0,3642;0,3643 
y;0,3842;0,3831;0,3833 
u';0,2126;0,2121;0,2121 
v';0,5026;0,502;0,5021 
;;; 

ich nur bei der Auswahl einiger Informationen interessiert bin (etwa 450 der 523 Zeilen) und eine transponierte Datenrahmen, wie am Ende:

Date  Time  Ev # ... 
V2 2016-09-19 12:05:03 1310 # ... 
V3 2016-09-19 12:06:01 1350 # ... 
V4 2016-09-19 12:07:00 1270 # ... 
# [...] 

die Art und Weise habe ich versucht, lautet:

Date <- t(read.csv2("filename", nrows=1, skip=5, header=F)[,-1]) 
Time <- t(read.csv2("filename", nrows=1, skip=6, header=F)[,-1]) 
Ev <- t(read.csv2("filename", nrows=1, skip=8, header=F)[,-1]) 
# [...] (for all the about 450 choosen vectors!!!) 
df <- data.frame(Date = Date, Time = Time, Ev = Ev) # ... 

und

columns <- c(n1, n2, n3, n4, n5, Date, Time, n6, Ev) # [...] 
raw_csv <- t(read.csv2("filename", header=F, col.names = columns, colClasses = c(rep("NULL",5),rep("Date",2),"NULL","numeric")) # ... 
df <- data.frame(raw_csv) 

Ich fühle mich wie ich nicht in der Lage bin, etwas besser strukturiert, finden das heißt Vermeidung von 450 mal separat zu definieren, was Ich mag würde haben und wo sie zu finden.

In beiden Fällen erreiche ich nicht einmal mein Ziel, wegen der Lücken in den .csv, Klammern und so weiter. Zu viele Probleme zur gleichen Zeit, denke ich ...

Vielen Dank für Ihre Hilfe!

+0

hat die Anzahl der Datum/Uhrzeit übereinstimmt mit der Anzahl der Zeilen für Ihre Daten? –

+0

Ja, am Ende sollte es mit der Anzahl der Zeilen meiner endgültigen Daten übereinstimmen. – proiemi

Antwort

0

Während die ultimative Form werden Sie auf die Angaben der betreffenden Datei sehr abhängig sein brauchen, für das, was Sie hier vorgestellt haben, können Sie die Daten aus, ohne zu viel Wahnsinn hacken:

library(tidyverse) 

df <- read_csv2(file, col_names = FALSE) %>% 
    filter(rowSums(!is.na(.)) > 0) %>% 
    magrittr::set_rownames(.[[1]]) %>% 
    select(-1) %>% 
    t() %>% 
    as_data_frame() %>% 
    type_convert(col_types = cols(Date = col_date('%d.%m.%Y')), 
       locale = locale(decimal_mark = ',')) 

df 
#> # A tibble: 3 x 12 
#> Name Correction  Date  Time `T_int [ms]` `Ev [lx]` 
#> <chr>  <chr>  <date> <time>  <int>  <dbl> 
#> 1 #1  <NA> 2016-09-19 12:05:03   806  1310 
#> 2 #2  <NA> 2016-09-19 12:06:01   800  1350 
#> 3 #3  <NA> 2016-09-19 12:07:00   884  1270 
#> # ... with 6 more variables: `Ee [W/sqm] (380-780nm)` <dbl>, `Chrom. 
#> # Coord.` <chr>, x <dbl>, y <dbl>, `u'` <dbl>, `v'` <dbl> 

Daten

file <- ";;; 
;;; 
;;; 
Name;#1;#2;#3 
Correction;;;   
Date;19.09.2016;19.09.2016;19.09.2016 
Time;12:05:03;12:06:01;12:07:00 
T_int [ms];806;800;884 
Ev [lx];1,31E+03;1,35E+03;1,27E+03 
Ee [W/sqm] (380-780nm);4,22E+00;4,38E+00;4,17E+00 
;;; 
;;; 
Chrom. Coord.;;;   
x;0,3657;0,3642;0,3643 
y;0,3842;0,3831;0,3833 
u';0,2126;0,2121;0,2121 
v';0,5026;0,502;0,5021 
;;;" 
+0

Oh! Das ist eigentlich viel besser, da es sich tatsächlich um eine korrekt formatierte (wenn auch seitwärts) CSV handelt und nicht nur um unstrukturierten Text, so dass Sie die Regex vermeiden können. Siehe die Änderung. – alistaire

+0

Vielen Dank! Wenn ich mit dem gesamten Datensatz arbeite, erhalte ich zwei Nachrichten. Ich verstehe den ersten überhaupt nicht: 'Verwenden von ',' als Dezimalzahl und '.' als Gruppierungszeichen. Verwenden Sie read_delim() für mehr Kontrolle. Dann habe ich einen 'Fehler in' row.names <-. Data.frame' ('* tmp *', value = value): doppelte 'row.names' sind nicht erlaubt '(Die Ausgabe dieses Instruments ist nicht wirklich R-freundlich ...). Wie kann ich Variable Namen und Zeilen loswerden (zB 'CCT [K]' mehr als einmal vergleichen? – proiemi

+0

Die erste ist nur eine Nachricht (kein Fehler) von 'read_csv2' und sagt Ihnen, was es macht Problem, dem man ausweichen könnte, indem man es zuerst zu einer Matrix macht, aber es ist eine bessere Idee, das Problem einfach zu lösen, indem man es in 'magrittr :: set_rownames (make.unique (. [[1]]))' 'ändert Wahrscheinlich werde ich danach mehr aufräumen müssen – alistaire

Verwandte Themen