read_excel (из пакета readxl) считывает даты до 1899-12-30 как NA, как обойти это? - PullRequest
0 голосов
/ 03 февраля 2019

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

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

Как это исправить, чтобы все даты приходили из 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 Ответ

0 голосов
/ 04 февраля 2019

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

Во-первых, прочитайте как "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 считает, они должны быть.

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

excerpt of excel spreadsheet showing

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

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...