2017-01-30 8 views
0

をさかのぼり、私はPOSIXベクトルはpurrr ::廃棄NAは

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

を持っていると私はNAをドロップしたいとpurrr::discardにさかのぼり:

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

それがエラーをスローなぜ誰も説明していただけますか?例えば

y <- c(1, NA) 

のために、それはうまく機能:

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

私は関数 'discard'はPOSIXltクラスが気に入らないと思いますが、わかりません。 xを文字に変換すると動作します。 – ira

答えて

1

これはまさにあなたの質問にお答えします場合、私は知らないが、私は変更することによって、discard機能を利用することができましたコードは少しです。ここに私がやったことだ:keepdiscard以来

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 

両方の仕事ベクターを用いて、データは私がmap関数がでdiscardを供給で良い作品だと思う理由は、特定の方法で彼らに手渡しする必要があるように見えますそれが好きな方法でデータ。

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 

それはまたあなたにもstrptimeを使用する場合に機能します。

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 

をあなたが気づけばあなたはmap_df機能を実行した後、しかしPOSIXltクラスでtibbleを作成し、することはできません日時オブジェクトはPOSIXctに変換されます。

知識が深いpurrrの知識を持つ他の人が、エラーメッセージに関する特定の質問に回答できることを願っています。ただし、回避策を講じたいと思っていました。

+0

残念ながら、これらの2つの列の数が異なるとソリューションが失敗します。私たちが回避策について話すならば、 'x [!is.na(x)]'はうまくいくので、なぜ '破棄 'が失敗するのかという疑問がありました。そして、私は実際にそれを理解したと思います。長さnのPOSIXltベクトルとして表示されるものは、長さnの下にそれぞれ11個のベクトルのリストです。それを見る 'map(x、identity)'。 –

+0

しかし、あなたの答えに感謝します - 今私は、POSIXltがデータフレームでPOSIXctに変換され、POSIXctはそのような構造を持たないので、破棄してもうまく処理できることを知っています。 ( 'data.frame(x)[[1]]%>%map(identity)') –