2015-08-20 3 views
2

При чтении в csv-файлах с использованием объектов даты пакета readr хранятся как целые значения. Когда я говорю, что хранится как целое, я не имею в виду класс столбца даты, я имею в виду базовое значение R значений даты. Это предотвращает возможность использования функций соединения dplyr, если даты одного фрейма данных хранятся как числовые значения, а другие - целые. Ниже приведен воспроизводимый пример. Есть ли что-нибудь, что я могу сделать, чтобы предотвратить такое поведение?Почему readr хранит объекты даты как целые значения?

library(readr) 

df1 <- data.frame(Date = as.Date(c("2012-11-02", "2012-11-04", "2012-11-07", "2012-11-09", "2012-11-11")), Text = c("Why", "Does", "This", "Happen", "?"), stringsAsFactors = F) 
class(df1$Date) 
# [1] "Date" 
dput(df1$Date[1]) 
# structure(15646, class = "Date") 

# Write to dummy csv 
write.csv(df1, file = "dummy_csv.csv", row.names = F) 

# Read back in data using both read.csv and read_csv 
df2 <- read.csv("dummy_csv.csv", as.is = T, colClasses = c("Date", "character")) 
df3 <- read_csv("dummy_csv.csv") 

# Examine structure of date values 
class(df2$Date) 
# [1] "Date" 
class(df3$Date) 
# [1] "Date" 

dput(df2$Date[1]) 
# structure(15646, class = "Date") 
dput(df3$Date[1]) 
# structure(15646L, class = "Date") 

# Try to join using dplyr joins 
both <- full_join(df2, df3, by = c("Date")) 
Error: cannot join on columns 'Date' x 'Date': Cant join on 'Date' x 'Date' because of incompatible types (Date/Date) 

# Base merge works 
both2 <- merge(df2, df3, by = "Date") 

# converting a POSIXlt object to Date is also stored as numeric 
temp_date <- as.Date(as.POSIXct("11OCT2012:19:00:00", format = "%d%b%Y:%H:%M:%S")) 
dput(temp_date) 
# structure(15624, class = "Date") 

Судя по this issue на dplyr репо, похоже Hadley думает, что это функция, но в любое время ваши значения даты хранятся иначе вы не можете объединить их, и я не понял, путь к преобразовать целочисленный объект даты в числовой. Есть ли в любом случае, чтобы остановить пакет readr от этого или каким-либо образом преобразовать объект Date, сохраненный как целое число, в числовое значение?

ответ

4

Согласно the big man himself Это ошибка с dplyr не readr. Он говорит, что сохранение числовых значений vs integer при чтении в файлах нормально, но dplyr должен иметь возможность обрабатывать разницу, например merge.

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