read_excel (из пакета readxl) считывает даты до 1899-12-30 как NA, как обойти это?

У меня есть набор данных из 130 футбольных матчей, датированных 1893 годом.

Когда я импортирую набор данных из Excel, даты 1900 года должны быть такими, какими они должны быть в R (RStudio). Но даты до 1900 года называются НС.

Как я могу это исправить, чтобы все даты приходили из Excel в правильном формате?

Или, как я могу заменить NA с правильными (18XX-MM-DD) датами?

Вот данные, которые отображаются в Excel:

    Home_Team, Away_Team, SUFC, SWFC, H,  A,  Score, Season, Date

Sheffield United, Sheffield Wednesday, 1, 1, 1, 1, 1–1, 1893/94, 1893-10-16

Sheffield United, Sheffield Wednesday, 1, 0, 1, 0, 1–0, 1894/95, 1895-01-12

Sheffield United, Sheffield Wednesday, 1, 1, 1, 1, 1–1, 1895/96, 1895-12-26

Sheffield United, Sheffield Wednesday, 2, 0, 2, 0, 2–0, 1896/97, 1896-12-26

Sheffield United, Sheffield Wednesday, 1, 1, 1, 1, 1–1, 1897/98, 1897-12-27

Sheffield United, Sheffield Wednesday, 2, 1, 2, 1, 2–1, 1898/99, 1898-12-26

Sheffield United, Sheffield Wednesday, 1, 0, 1, 0, 1–0, 1900/01, 1900-12-15

Sheffield United, Sheffield Wednesday, 3, 0, 3, 0, 3–0, 1901/02, 1902-03-01

Sheffield United, Sheffield Wednesday, 2, 3, 2, 3, 2–3, 1902/03, 1902-09-01

Sheffield United, Sheffield Wednesday, 1, 1, 1, 1, 1–1, 1903/04, 1903-12-12

Sheffield United, Sheffield Wednesday, 4, 2, 4, 2, 4–2, 1904/05, 1905-04-08

Sheffield United, Sheffield Wednesday, 0, 2, 0, 2, 0–2, 1905/06, 1905-10-21

Это код R, который я применяю к нему:

library(tidyverse)
library(readxl)
library(magrittr)
library(dplyr)
library(ggplot2)
library(tidyr)

Sheff_derby_R <- read_excel("sheffield_derby/Sheff_derby_R.xlsx", 
                        col_types = c("text", "text", "text", 
                                      "text", "text", "text", "text", 
                                       "text", 
                                      "date", "text", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "numeric", "numeric", 
                                      "numeric", "text"))
 View(Sheff_derby_R)

В R он выходит с датами 18xx (последний столбец, а не col сезона 18xx /xx), замененными на NA. Это голова, первые 12 строк:

    Home_Team Away_Team SUFC  SWFC  H     A     Score Season Date                
   <chr>     <chr>     <chr> <chr> <chr> <chr> <chr> <chr>  <dttm>              
 1 Sheffiel~ Sheffiel~ 1     1     1     1     1 – 1 1893/~ NA                  
 2 Sheffiel~ Sheffiel~ 1     0     1     0     1 – 0 1894/~ NA                  
 3 Sheffiel~ Sheffiel~ 1     1     1     1     1 – 1 1895/~ NA                  
 4 Sheffiel~ Sheffiel~ 2     0     2     0     2 – 0 1896/~ NA                  
 5 Sheffiel~ Sheffiel~ 1     1     1     1     1 – 1 1897/~ NA                  
 6 Sheffiel~ Sheffiel~ 2     1     2     1     2 – 1 1898/~ NA                  
 7 Sheffiel~ Sheffiel~ 1     0     1     0     1 – 0 1900/~ 1900-12-15 00:00:00 
 8 Sheffiel~ Sheffiel~ 3     0     3     0     3 – 0 1901/~ 1902-03-01 00:00:00 
 9 Sheffiel~ Sheffiel~ 2     3     2     3     2 – 3 1902/~ 1902-09-01 00:00:00 
10 Sheffiel~ Sheffiel~ 1     1     1     1     1 – 1 1903/~ 1903-12-12 00:00:00 
11 Sheffiel~ Sheffiel~ 4     2     4     2     4 – 2 1904/~ 1905-04-08 00:00:00 
12 Sheffiel~ Sheffiel~ 0     2     0     2     0 – 2 1905/~ 1905-10-21 00:00:00 

1 ответ

Решение

Независимо от ошибки, вот возможный (временный) обходной путь:

Во-первых, читать как "text" чтобы увидеть одну причину, почему R немного задыхается. (Я слишком упрощаю read_excel аргументы здесь, так как "text" это то, что по умолчанию для Date в этом случае. В вашем случае просто обновите с "date" в "text" в вашем векторе col_types.)

library(readxl)
x <- read_excel("Sheff_derby_SO.xlsx")
x$Date
#  [1] "1893-10-16" "1895-01-12" "1895-12-26" "1896-12-26" "1897-12-27"
#  [6] "1898-12-26" "350"        "791"        "975"        "1442"      
# [11] "1925"      

Для дат 1900 и позже они передаются как целые числа. Все они основаны на одном и том же происхождении даты, так что взломать мы можем:

wrong <- !grepl("-", x$Date)
as.Date("1900-01-01") + as.integer(x$Date[wrong]) - 2L
# [1] "1900-12-15" "1902-03-01" "1902-09-01" "1903-12-12" "1905-04-08"

что соответствует тому, что Excel говорит мне, что думает, что они должны быть.

NB: я ожидал, что это будет простое смещение, но + 2L было необходимо, чтобы привести его в соответствие. Это говорит о том, что может происходить что-то еще, поэтому, пожалуйста, проверьте со всеми вашими данными (в случае, если это не все из них), что этот взлом справедлив для других значений.

Заменить их в вашем наборе данных так же просто, как

sav <- as.Date("1900-01-01") + as.integer(x$Date[wrong]) - 2L
x$Date <- as.Date(x$Date) # 'wrong' ones will be NA
x$Date[wrong] <- sav
x$Date
#  [1] "1893-10-16" "1895-01-12" "1895-12-26" "1896-12-26" "1897-12-27"
#  [6] "1898-12-26" "1900-12-15" "1902-03-01" "1902-09-01" "1903-12-12"
# [11] "1905-04-08"
Другие вопросы по тегам