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"