Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Date column coerced to numeric when indexing dataframe with [[ and a vector

I am creating a data.frame with a column of type Date. When indexing the data frame with [[ and a numeric vector, the Date becomes a number. This is causing a problem when using purrr::pmap. Can anyone explain why this is happening and is there a work around?

Example:

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
like image 436
MrHopko Avatar asked Sep 30 '18 16:09

MrHopko


People also ask

Which function coerces an existing object to a data frame if possible?

as_tibble() turns an existing object, such as a data frame or matrix, into a so-called tibble, a data frame with class tbl_df . This is in contrast with tibble() , which builds a tibble from individual columns. as_tibble() is to tibble() as base::as.

How do you check if a column is a factor in R?

factor() Function. is. factor() function in R Language is used to check if the object passed to the function is a Factor or not. It returns a boolean value as output.

How do I convert specific columns to numeric in R?

To convert all the columns of the data frame to numeric in R, use the lapply() function to loop over the columns and convert to numeric by first converting it to character class as the columns were a factor.


1 Answers

Overview

After reading why does unlist() kill dates in R and the documentation of unlist(), you've got to manually prevent purrr::map() from coercing the Date objects to integer by way of using the base::c() function.

Load mikmart's PR version of purrr::pmap()

After reading pmap strips Date, it looks like someone very awesome submitted a pull request to resolve this issue within a refactored version of the indexing that happens under the hood in purrr::pmap().

Using devtools::dev_mode(), you can install mikmart/purrr's "pmap" branch version of purrr to retain Date objects while using 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 #
like image 130
Cristian E. Nuno Avatar answered Nov 10 '22 09:11

Cristian E. Nuno