Я хочу рассчитать разницу между ячейками в кадре данных одного столбца.
> 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
, но он никогда не работал.