2017-01-30 5 views
0

sagen, dass ich ein POSIX-Vektor habenpurrr :: verwerfen NA Daten

x <- strptime(c("2017-01-30", ""), "%Y-%m-%d") 
x 
[1] "2017-01-30 EET" NA 

und ich möchte fallen NA Daten mit purrr::discard:

> library(purrr) 
> discard(x, is.na) 
Error: Result 1 is not a length 1 atomic vector 

Könnte jemand bitte erklären, warum es einen Fehler wirft?

Zum Beispiel für

y <- c(1, NA) 

es gut funktioniert:

> discard(y, is.na) 
[1] 1 
+0

Ich denke, dass die Funktion 'discard' die POSIXlt-Klasse nicht mag, aber ich bin mir nicht sicher. Es funktioniert, wenn Sie x in Zeichen konvertieren. – ira

Antwort

1

Ich weiß nicht, ob dies genau Ihre Frage beantworten, aber ich war in der Lage, die discard Funktion nutzen durch Modifizieren der Code ein wenig. Hier ist, was ich getan habe:

date1 <- readr::parse_date(c("2017-01-30", "2017-02-03", " ")) 
date2 <- readr::parse_date(c("2016-01-30", "", "2016-02-03")) 
df <- tibble(date1, date2) 
df 

# A tibble: 3 x 2 
     date1  date2 
     <date>  <date> 
1 2017-01-30 2016-01-30 
2 2017-02-03   NA 
3   NA 2016-02-03 

Seit keep und discard beide arbeiten mit Vektoren, es sieht aus wie Daten, um sie zu übergeben hat in einer bestimmten Art und Weise, weshalb ich glaube, die map Funktion besser funktioniert bei Versorgung discard mit die Daten so, wie es gefällt.

map_df(df, discard, is.na) 

# A tibble: 2 x 2 
     date1  date2 
     <dttm>  <dttm> 
1 2017-01-30 2016-01-30 
2 2017-02-03 2016-02-03 

Es funktioniert auch, wenn Sie strptime auch verwenden mögen: obwohl

date1 <- strptime(c("2017-01-30", "2017-02-03", ""), "%Y-%m-%d") 
date2 <- strptime(c("2016-01-30", "", "2016-02-03"), "%Y-%m-%d") 
df <- data.frame(date1, date2) 
df 

     date1  date2 
1 2017-01-30 2016-01-30 
2 2017-02-03  <NA> 
3  <NA> 2016-02-03 

map_df(df, discard, is.na) 

# A tibble: 2 x 2 
     date1  date2 
     <dttm>  <dttm> 
1 2017-01-30 2016-01-30 
2 2017-02-03 2016-02-03 

Sie können nicht erstellen tibble mit der POSIXlt Klasse, und wenn Sie feststellen, nach dem Ausführen der map_df Funktion Datum-Uhrzeit-Objekte werden in POSIXct konvertiert.

Hoffentlich jemand anderes mit tieferen purrr Wissen kann die spezifische Frage über die Fehlermeldung beantworten - ich dachte, Sie möchten vielleicht einige Abhilfe in der Zwischenzeit, aber.

+0

Leider schlägt Ihre Lösung fehl, wenn diese beiden Spalten eine unterschiedliche Anzahl von NAs haben. Und wenn wir über eine Problemumgehung sprechen, 'x [! Is.na (x)]' 'funktioniert gut, so war die Frage mehr, warum 'discard' fehlschlägt. Und ich denke, ich habe es tatsächlich herausgefunden: Was Sie als einen POSIXlt-Vektor der Länge n sehen, ist eine Liste von 11 Vektoren jeder Länge n darunter - tippen Sie einfach z. 'map (x, identity)' um es zu sehen. –

+0

Aber trotzdem, danke für Ihre Antwort - jetzt weiß ich, dass POSIXlt in Datenrahmen in POSIXct konvertiert wird und POSIXct hat keine solche Struktur, so dass es gut mit dem Verwerfen behandelt werden kann. ('data.frame (x) [[1]]%>% map (identity)') –