Как преобразовать в формате даты столбцы конкретного файла Excel? - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть файл Excel с 77 столбцами (с 43 столбцами NA) различной длины, 12 из которых являются датой. В идеале я хочу импортировать его в набор данных R со столбцами, которые ссылаются на дату в формате даты, а остальные столбцы в формате цифр c. В stackoverflow много материала, и я перепробовал все варианты, но он не работает.

Первый вариант - сделать это напрямую из Excel:

dataset <- read_xlsx("Data.xlsx", col_types = "numeric") #it gives everything numeric but column date always in this format "36164"

#I also tried something like this:

dataset <- read_xlsx("Data.xlsx", col_types = c("date", rep("numeric", n))) #where "n" stands for all the columns with numbers I have but it did not work

Я могу импортировать данные с ошибочными столбцами даты. После некоторой очистки (удаления столбцов NA) я получаю табличку с другой длиной столбца. Я попробовал следующие коды, чтобы преобразовать неправильные даты столбца в формат даты:

dataset <- janitor::remove_empty(dataset, which = "cols") #remove NA columns
dataset <- dataset[-c(1),] #remove the first row of all columns

# Now using this command I could transform each incorrect date column into a date format:

  date <- as.Date(as.numeric(dataset$column1), origin = "1899-12-30")

# I would like to do it for all the date columns in one shot but when I try to do it in this way

  as.Date(as.numeric(dataset[,c(1,3,5,7,14,16,18,20,21,23,25,32)]), origin = "1899-12-30")

# I get an error, probably because the columns have different length
# the error is: Error in as.Date(as.numeric(var_dataset[, c(1, 3, 5, 7, 14, 16, 18, 20,  : 
  'list' object cannot be coerced to type 'double'
# unlisting the object doesn't solve the problem

Я знаю, что отсутствуют данные, чтобы воспроизвести мою проблему, но в первом сценарии я не знаю, как приблизить мои довольно большой файл Excel, в то время как во втором случае я не знаю, как создать таблицу со многими столбцами разной длины, не тратя много времени. Извините.

Есть ли у вас решение? Либо для импорта напрямую из Excel, либо для воспроизведения с фреймом данных

Большое спасибо

Я прикрепляю здесь структуру своего набора данных:

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   5500 obs. of  77 variables:
 $ Name...1                                                     : chr  "Code" "36164" "36165" "36166" ...
 $ VSTOXX VOLATILITY INDEX - PRICE INDEX                        : chr  "VSTOXXI(PI)" "18.2" "29.69" "25.17" ...
 $ ...3                                                         : logi  NA NA NA NA NA NA ...
 $ ...4                                                         : logi  NA NA NA NA NA NA ...
 $ ...5                                                         : logi  NA NA NA NA NA NA ...
 $ ...6                                                         : logi  NA NA NA NA NA NA ...
 $ Name...7                                                     : chr  "Code" "36799" "36830" "36860" ...
 $ EM COMPOSITE INDICATOR OF SOVEREIGN STRESS: GDP WEIGHTS NADJ : chr  "EMEBSCGWR" "7.8255999999999992E-2" "8.9886999999999995E-2" "8.0714999999999995E-2" ...
 $ ...9                                                         : logi  NA NA NA NA NA NA ...
 $ Name...10                                                    : chr  "Code" "36168" "36175" "36182" ...
 $ CISS BOND MKT: GOV & NFC VOLATILITY - ECONOMIC SERIES        : chr  "EMCIBMG" "4.4651999999999997E-2" "6.6535999999999998E-2" "4.9789E-2" ...
 $ ...12                                                        : logi  NA NA NA NA NA NA ...
 $ Name...13                                                    : chr  "Code" "36168" "36175" "36182" ...
 $ CISS MONEY MKT: 3M RATE+ VOLATILITY - ECONOMIC SERIES        : chr  "EMECM3E" "5.7435999999999994E-2" "7.463199999999999E-2" "7.2263999999999995E-2" ...
 $ CISS FX MKT: EUR VOLATILITY - ECONOMIC SERIES                : chr  "EMECFEM" "7.2139999999999996E-2" "8.6049E-2" "4.5948999999999997E-2" ...
 $ CISS FIN INTERM: BANK+ VOLATILITY - ECONOMIC SERIES          : chr  "EMCIFIN" "4.5384999999999995E-2" "0.11820399999999999" "0.11516499999999999" ...
 $ CISS NF EQUITY: VOLATILITY - ECONOMIC SERIES                 : chr  "EMCIEMN" "7.7453999999999995E-2" "0.12733" "0.11918899999999999" ...
 $ CISS: CROSS SUBINDEXCORRELATION - ECONOMIC SERIES            : chr  "EMCICRO" "-0.21210999999999999" "-0.29791000000000001" "-0.2369" ...
 $ SYSTEMIC STRESS COMPINDICATOR - ECONOMIC SERIES              : chr  "EMCISSI" "8.4954000000000002E-2" "0.174844" "0.16546" ...
 $ ...20                                                        : logi  NA NA NA NA NA NA ...
 $ ...21                                                        : logi  NA NA NA NA NA NA ...
 $ ...22                                                        : logi  NA NA NA NA NA NA ...
 $ ...23                                                        : logi  NA NA NA NA NA NA ...
 $ ...24                                                        : logi  NA NA NA NA NA NA ...
 $ ...25                                                        : logi  NA NA NA NA NA NA ...
 $ Name...26                                                    : chr  "Code" "33253" "33284" "33312" ...
 $ Z8 IPI: MFG., VOLUME INDEX OF PRODUCTION, 2015=100 (WDA) VOLA: chr  "Z8ES493KG" "81" "79.7" "79.400000000000006" ...
 $ ...28                                                        : logi  NA NA NA NA NA NA ...
 $ ...29                                                        : logi  NA NA NA NA NA NA ...
 $ ...30                                                        : logi  NA NA NA NA NA NA ...
 $ ...31                                                        : logi  NA NA NA NA NA NA ...
 $ ...32                                                        : logi  NA NA NA NA NA NA ...
 $ ...33                                                        : logi  NA NA NA NA NA NA ...
 $ ...34                                                        : logi  NA NA NA NA NA NA ...
 $ Name...35                                                    : chr  "Code" "35779" "35810" "35841" ...
 $ EH HICP: ALL-ITEMS NADJ                                      : chr  "EHES795WR" "1.7" "1.6" "1.6" ...
 $ ...37                                                        : logi  NA NA NA NA NA NA ...
 $ ...38                                                        : logi  NA NA NA NA NA NA ...
 $ Name...39                                                    : chr  "Code" "35110" "35139" "35170" ...
 $ EH HICP: ALL-ITEMS (%MOM) NADJ                               : chr  "EHESPQ93R" "0.4" "0.4" "0.3" ...
 $ ...41                                                        : logi  NA NA NA NA NA NA ...
 $ ...42                                                        : logi  NA NA NA NA NA NA ...
 $ ...43                                                        : logi  NA NA NA NA NA NA ...
 $ Name...44                                                    : chr  "Code" "35445" "35476" "35504" ...
 $ EH HICP: ALL-ITEMS HICP (%YOY) NADJ                          : chr  "EHESAKZER" "2.2000000000000002" "2" "1.7" ...
 $ ...46                                                        : logi  NA NA NA NA NA NA ...
 $ ...47                                                        : logi  NA NA NA NA NA NA ...
 $ ...48                                                        : logi  NA NA NA NA NA NA ...
 $ ...49                                                        : logi  NA NA NA NA NA NA ...
 $ Name...50                                                    : chr  "Code" "36206" "36234" "36265" ...
 $ EM EUROSYSTEM: BASE MONEY CURN                               : chr  "EMEBSMYBA" "426.64374199999997" "430.51499999999999" "432.34064499999999" ...
 $ ...52                                                        : logi  NA NA NA NA NA NA ...
 $ ...53                                                        : logi  NA NA NA NA NA NA ...
 $ ...54                                                        : logi  NA NA NA NA NA NA ...
 $ ...55                                                        : logi  NA NA NA NA NA NA ...
 $ Name...56                                                    : chr  "Code" "35703" "35734" "35762" ...
 $ EM EUROSYSTEM: TOTAL ASSETS/LIABILITIES (EP) CURN            : chr  "EMECBSALA" "710257.53500000003" "711193.47100000002" "714957.58900000004" ...
 $ ...58                                                        : logi  NA NA NA NA NA NA ...
 $ ...59                                                        : logi  NA NA NA NA NA NA ...
 $ ...60                                                        : logi  NA NA NA NA NA NA ...
 $ ...61                                                        : logi  NA NA NA NA NA NA ...
 $ ...62                                                        : logi  NA NA NA NA NA NA ...
 $ ...63                                                        : logi  NA NA NA NA NA NA ...
 $ Name...64                                                    : chr  "Code" "41548" "41579" "41609" ...
 $ TR EU FWD INFL-LKD SWAP 10YF20Y - MIDDLE RATE                : chr  "TREFSTT" NA NA NA ...
 $ TR EU FWD INFL-LKD SWAP 10YF10Y - MIDDLE RATE                : chr  "TREFS1T" NA NA NA ...
 $ TR EU FWD INFL-LKD SWAP 2YF2Y - MIDDLE RATE                  : chr  "TREFS22" "1.5158" "1.4669000000000001" "1.4715" ...
 $ TR EU FWD INFL-LKD SWAP 1YF1Y - MIDDLE RATE                  : chr  "TREFS11" "1.4509000000000001" "1.2338" "1.1225000000000001" ...
 $ TR EU FWD INFL-LKD SWAP 2YF3Y - MIDDLE RATE                  : chr  "TREFS23" "1.5906000000000002" "1.5453000000000001" "1.5283000000000002" ...
 $ TR EU FWD INFL-LKD SWAP 5YF10Y - MIDDLE RATE                 : chr  "TREFS5T" "2.3516000000000004" "2.3323" "2.3070000000000004" ...
 $ ...71                                                        : logi  NA NA NA NA NA NA ...
 $ ...72                                                        : logi  NA NA NA NA NA NA ...
 $ ...73                                                        : logi  NA NA NA NA NA NA ...
 $ ...74                                                        : logi  NA NA NA NA NA NA ...
 $ ...75                                                        : logi  NA NA NA NA NA NA ...
 $ Name...76                                                    : chr  "Code" "41255" "41286" "41317" ...
 $ TR EU FWD INFL-LKD SWAP 5YF5Y - MIDDLE RATE                  : chr  "TREFS55" "2.2027000000000001" "2.2637" "2.383" ...

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

Вы должны правильно указать col_types в команде read_excel (или read_xlsx). Например:

dataset <- read_xlsx("Data.xlsx",
     col_types=c("numeric","date","numeric","date","numeric", "date", ...))

Редактировать : Наконец, после большого опроса проблема заключается в том, что ваши данные начинаются со строки 3, а не 2. Поэтому пропустите первую строку (skip=1) и попробуйте еще раз.

dataset <- read_xlsx("Data.xlsx", skip=1)
1 голос
/ 16 февраля 2020

edit: Хотя это, скорее всего, решит возникшую ошибку, я согласен с советом Эдварда использовать readxl::read_excel, который должен сохранить даты.

Проблема с

  as.Date(as.numeric(dataset[,c(1,3,5,7,14,16,18,20,21,23,25,32)]), origin = "1899-12-30")

означает, что вы применяете as.numeric к таблице, которая внутренне является списком. Вместо этого выполните

dplyr::mutate_at(
    dataset, 
    c(1,3,5,7,14,16,18,20,21,23,25,32), 
    dplyr::funs(as.numeric, as.Date), 
    origin = "1899-12-30",
    format = "%Y-%m-%d"
)

Вы говорите, что столбцы имеют разную длину, но это невозможно в табличных структурах R (tibble, data.frame, data.table). Урок: Всегда помните, с каким типом данных вы работаете, например str(dataset). as.numeric не работает с таблицами, но его необходимо применить к указанным c столбцам, используя, например, mutate.

...