2017-01-30 30 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功能代码有点。下面是我所做的:

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 

由于keepdiscard与向量都工作,它看起来像数据在一个特定的方式交给他们,这就是为什么我认为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 

不能创建与POSIXlt类tibble不过,如果你注意到,在运行map_df功能后日期时间对象转换为POSIXct。

希望有更深的purrr知识的其他人可以回答有关错误消息的具体问题 - 但我认为您可能需要一些解决方法。

+0

不幸的是,当这两列具有不同数量的NAs时,您的解决方案会失败。如果我们谈论解决方法,'x [!is.na(x)]'运作良好,所以问题更多的是为什么'放弃'失败。我想我实际上已经想出了它:你看到的长度为n的POSIXlt向量是一个11个向量,每个长度为n的列表,只需键入例如'map(x,identity)'看到它。 –

+0

但是,尽管如此,感谢您的回答 - 现在我知道POSIXlt在数据框架中转换为POSIXct,而POSIXct没有这样的结构,因此可以放弃使用。 ('data.frame(x)[[1]]%>%map(identity)') –