Функция apply.weeky неожиданно возвращает «x» должно быть numeri c »только при использовании« sum »или« colSums » - PullRequest
0 голосов
/ 08 мая 2020

Я импортировал данные из CSV, а затем помещал их в фрейм данных. Затем я вставляю его, конвертирую в XTS. После этого я использую apply.weekly, чтобы разбить его на данные за неделю. Код ниже.

library(padr)
library(xts)
library(tidyr)
library(seasonal)
library(forecast)]
library(lubridate)
library(tidyverse)
library(zoo)

df <- data.frame(data$f1.date[1:831], data.$f1[1:831])  #create data frame
colnames(df)<- c('date', 'f1')
df$date <- (as.Date(df$date, format='%m/%d/%Y'))
df<-pad(df)  # add missing dates


df<-xts(df, order.by = df$date)
df$t1<-replace_na(df$f1,0)  # Add Zeros for NA vals

dtw<-apply.weekly(df$f1,FUN=colSums) # I've tried using sum, colSums and mean.  Mean works fine.

Однако sum или colSums возвращает следующее.

Error in FUN(x[(INDEX[y] + 1):INDEX[y + 1]], ...) : 'x' must be numeric

До сих пор я думал только о том, чтобы попробовать df$t1<-as.numeric(df$t1), но это не помогло.

Есть ли у кого-нибудь предложения по этому поводу? Этот сценарий отлично работал с тем же файлом csv, и я не думаю, что что-то изменилось. Я могу думать только о том, что какой-то пакет не загрузился.

Образец моих данных ниже, полная версия содержит примерно 800 строк. Сейчас я работаю над тем, чтобы сделать его воспроизводимым.

Использование dput(head(df)) дает мне это.

structure(c("2010-01-01", "2010-01-02", "2010-01-03", "2010-01-04", 
"2010-01-05", "2010-01-06", " 1", "0", "0", "0", "0", "0"), class = c("xts", 
"zoo"), index = structure(c(1262304000, 1262390400, 1262476800, 
1262563200, 1262649600, 1262736000), tzone = "UTC", tclass = "Date"), .Dim = c(6L, 
2L), .Dimnames = list(NULL, c("date", "f1")))

Я также отредактировал его, изменив 't1' на 'f1' для единообразия.

Спасибо

1 Ответ

0 голосов
/ 09 мая 2020

Проблема в том, что ваш столбец f1 имеет символ класса.

is.character(df$f1)
[1] TRUE

Один из подходов - преобразовать его в numeri c в вашем apply.weekly вызове:

apply.weekly(df$f1,function(x){sum(as.numeric(x))})
           f1
2010-01-03  1
2010-01-06  0

Причина всего этого в том, что объекты класса xts хранят данные внутри матрицы. А матрицы в R могут иметь столбцы только одного класса.

...