Столбец даты приводится к числовому при индексации фрейма данных с помощью [[и вектора - PullRequest
0 голосов
/ 30 сентября 2018

Я создаю data.frame со столбцом типа Date.При индексации фрейма данных с помощью [[ и числового вектора Дата становится числом.Это вызывает проблему при использовании purrr::pmap.Может кто-нибудь объяснить, почему это происходит и есть ли обходной путь?

Пример:

x <- data.frame(d1 = lubridate::ymd(c("2018-01-01","2018-02-01")))

class(x$d1)
# [1] "Date"

x[[1]]
# [1] "2018-01-01" "2018-02-01"

x[[c(1, 1)]]
# [1] 17532

1 Ответ

0 голосов
/ 30 сентября 2018

Обзор

После прочтения почему unlist () убивает даты в R и документацию unlist(), вы должны вручную запретить purrr::map() от приведения объектов Date к целому числу с помощью функции base::c().

Загрузка PR-версии mikmart для purrr::pmap()

После прочтения pmap strips Date похоже, что кто-то очень классный отправил запрос на извлечение , чтобы решить эту проблему в рефакторированной версии индексации, которая происходит под капотом в purrr::pmap().

Используя devtools::dev_mode(), вы можете установить mikmart/purrr 'pmap' ветку версию purrr для сохранения объектов Date при использовании pmap().

# ******pmap() example ****
# load necessary packages -----
library(devtools)
library(lubridate)

# enter dev mode so you don't have to uninstall the cran version of purrr ----
dev_mode(on = TRUE)

# install mikmart's PR to fix the coercing of Dates to integer ----
install_github(repo = "mikmart/purrr", ref = "pmap")

# load mikmart's PR version of purrr ----
library(purrr)

# load necessary data
x <- data.frame(d1 = lubridate::ymd(c("2018-01-01","2018-02-01")))

# for the first column in x ----
# give me each element
# note: no need for c()
list.of.dates <-
  x %>%
  pmap(.f = ~ .x)

# view results -----
list.of.dates
# [[1]]
# [1] "2018-01-01"
# 
# [[2]]
# [1] "2018-02-01"

# view the class of each list -----
map_chr(list.of.dates, class) # [1] "Date" "Date"
#
# 
# turn off dev mode ---
dev_mode(on = FALSE)
#
# restart R -----
# Manually hit Shift+Cmd+F10 or point in click under the "Session" tab
#
# clear global environment ----
rm(list = ls())
#
# ******map() example********
# load necessary packages -----
library(tidyverse)
library(lubridate)

# load necessary data ----
x <- data.frame(d1 = lubridate::ymd(c("2018-01-01","2018-02-01")))

# from the first column ------
# give me each element
# and ensure the dates don't get coerced to integers
list.of.dates <-
  x$d1 %>%
  map(.f = ~ .x %>% c()) 

# view results -----
list.of.dates
# [[1]]
# [1] "2018-01-01"
# 
# [[2]]
# [1] "2018-02-01"

# # view the class of each list -----
map_chr(list.of.dates, class) # [1] "Date" "Date"

# end of script #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...