1

假设我有一个 POSIX 向量

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
4

1 回答 1

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知识渊博的人可以回答有关错误消息的特定问题-但是,我认为您可能同时需要一些解决方法。

于 2017-05-11T18:09:12.887 回答