2017-01-30 2 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 

С keep и discard и работы с векторами, похоже, данные должны быть переданы им определенным образом, поэтому я думаю, что функция 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 класса, хотя, и если вы заметили, после запуска map_df функции в объекты даты и времени преобразуются в POSIXct.

Надеюсь, кто-то еще с более глубоким purrr Знание может ответить на конкретный вопрос об ошибке - я думал, что вам может понадобиться некоторое обходное решение, тем не менее.

+0

К сожалению, ваше решение не выполняется, когда эти два столбца имеют разное количество НС. И если мы поговорим об обходном пути, 'x [! Is.na (x)]' работает хорошо, поэтому вопрос был больше, почему «discard» терпит неудачу. И я думаю, что я действительно понял это: то, что вы видите как вектор POSIXlt длины n, представляет собой список из 11 векторов, каждый из которых имеет длину n внизу - просто введите, например. 'map (x, identity)', чтобы увидеть его. –

+0

Но, тем не менее, спасибо за ваш ответ - теперь я знаю, что POSIXlt преобразуется в POSIXct в фреймах данных, а POSIXct не имеет такой структуры, поэтому его можно обрабатывать сбрасыванием. ('data.frame (x) [[1]]%>% map (identity)') –

Смежные вопросы