групповая проблема в датах, окружающих значения: не числовой аргумент для бинарного оператора - PullRequest
0 голосов
/ 28 марта 2019

Я хочу рассчитать разницу между ячейками в кадре данных одного столбца.

> head(df_benchmark)
        Date .STOXXR
1 2000-01-03  478.52
2 2000-01-04  459.53
3 2000-01-05  448.19
4 2000-01-06  446.24
5 2000-01-07  455.80
6 2000-01-10  462.97

Файл данных здесь .

Поэтому я попробовал следующее:

df_benchmark <- read.xlsx("Data.xlsx", sheet = "Benchmark", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
df_benchmark[2] <- data.matrix(df_benchmark[2])

> library(lubridate)
> percent_change2 <- function(x)last(x)/first(x) - 1
> monthly_return_benchmark <- df_benchmark %>% 
+   group_by(gr = floor_date(Date, unit = "month")) %>%
+   summarize_at(vars(-Date, -gr), percent_change2) %>%
+   ungroup() %>%
+   select(-gr) %>% 
+   as.matrix() 

Все же у меня есть ошибка.Кажется, что мой фрейм данных со столбцом дат и столбцом значений должен быть 1d атомным вектором или списком.Кажется, причина в проблеме переменных:

Error: Each variable must be a 1d atomic vector or list.
Problem variables: '.STOXXR'

Обновление

Я попытался Ответ Julian_Hn , который заметил, что я использовал df_benchmark[2] <- data.matrix(df_benchmark[2]).Это было использовано, потому что у меня была проблема с форматированием.

Поэтому я попробовал следующий код:

library(xts)
df_benchmark <- read.xlsx("Data.xlsx", sheet = "Benchmark", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)

percent_change2 <- function(x) last(x)/first(x) - 1
monthly_return_benchmark <- df_benchmark %>% 
  group_by(gr = floor_date(as_date(Date), unit = "month")) %>%
  summarize_at(vars(-Date, -gr), percent_change2) %>%
  ungroup()

# Generamos el xts, indicando la columna con la info de tiempo
monthly_return_benchmark <- xts(monthly_return[,-1], order.by=monthly_return$gr)

Но у меня была следующая ошибка:

> library(xts)
> df_benchmark <- read.xlsx("Data.xlsx", sheet = "Benchmark", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
> 
> percent_change2 <- function(x) last(x)/first(x) - 1
> monthly_return_benchmark <- df_benchmark %>% 
+   group_by(gr = floor_date(as_date(Date), unit = "month")) %>%
+   summarize_at(vars(-Date, -gr), percent_change2) %>%
+   ungroup()
Error in eval(substitute(expr), envir, enclos) : 
  non-numeric argument to binary operator

Третья попытка

Только используя group_by, используя месяцы в качестве единиц измерения, я получаю следующее:

> monthly_return_benchmark <- df_benchmark %>% 
+     group_by(gr = floor_date(Date, unit = "month"))
> monthly_return_benchmark
Source: local data frame [4,604 x 3]
Groups: gr [216]

         Date .STOXXR         gr
       <date>   <chr>     <date>
1  2000-01-03  478.52 2000-01-01
2  2000-01-04  459.53 2000-01-01
3  2000-01-05  448.19 2000-01-01
4  2000-01-06  446.24 2000-01-01
5  2000-01-07   455.8 2000-01-01
6  2000-01-10  462.97 2000-01-01
7  2000-01-11  459.85 2000-01-01
8  2000-01-12  459.84 2000-01-01
9  2000-01-13  462.27 2000-01-01
10 2000-01-14  473.43 2000-01-01
# ... with 4,594 more rows

Теперь я должен сделать percent_change2, но он никогда не работал.

1 Ответ

0 голосов
/ 28 марта 2019

Я заметил несколько ошибок: во-первых: почему вы делаете этот шаг?df_benchmark[2] <- data.matrix(df_benchmark[2]) Это причина ошибки, которую вы показали.После того, как я исправил это, я обнаружил еще одну ошибку в конвейере.

Этот код теперь выполняется для меня:

library(xts)
df_benchmark <- read.xlsx("Data.xlsx", sheet = "Benchmark", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)

percent_change2 <- function(x) last(x)/first(x) - 1
monthly_return_benchmark <- df_benchmark %>% 
  group_by(gr = floor_date(as_date(Date), unit = "month")) %>%
  summarize_at(vars(-Date, -gr), percent_change2) %>%
  ungroup()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...