R - 记录连续数据帧元素的返回值

问题描述 投票:1回答:2

我在R中有一个数据集,如下所示:

> head(statadata_one_every_5_minutes)
         date  time_greece gmt_offset_greece price_greece           time_and_date gmt_offset_greece_test time_and_date_correct time_and_date_difference
1  2009-12-01 08:30:04.548                +2      2275.32 2009-12-01 08:30:04.548                      2   2009-12-01 06:30:04                   0 secs
6  2009-12-01 08:35:04.380                +2      2297.74 2009-12-01 08:35:04.380                      2   2009-12-01 06:35:04                   0 secs
11 2009-12-01 08:40:04.328                +2      2322.04 2009-12-01 08:40:04.328                      2   2009-12-01 06:40:04                   0 secs
16 2009-12-01 08:45:04.365                +2      2325.51 2009-12-01 08:45:04.365                      2   2009-12-01 06:45:04                   0 secs
21 2009-12-01 08:50:04.463                +2      2331.36 2009-12-01 08:50:04.463                      2   2009-12-01 06:50:04                   0 secs
26 2009-12-01 08:55:04.403                +2      2335.09 2009-12-01 08:55:04.403                      2   2009-12-01 06:55:04                   0 secs
   ID price_greece_numeric
1   1              2275.32
6   6              2297.74
11 11              2322.04
16 16              2325.51
21 21              2331.36
26 26              2335.09

我试图使用以下命令计算连续元素的日志返回:

> n <- length(statadata_one_every_5_minutes$price_greece_numeric)
> statadata_one_every_5_minutes$log_returns <- log(statadata_one_every_5_minutes$price_greece_numeric[-1]/statadata_one_every_5_minutes$price_greece_numeric[-n])

但是我收到以下错误:

Error in `$<-.data.frame`(`*tmp*`, log_returns, value = c(0.00980532931107567,  : 
  replacement has 61897 rows, data has 61898

关于如何修复它的任何想法?

r
2个回答
1
投票

你需要使用lag

library(dplyr)

statadata_one_every_5_minutes %>% 
  mutate(log_returns = log(price_greece_numeric/lag(price_greece_numeric)))

0
投票

data$value[-1]删除第1行,它会为您提供一个短1的数据帧 - 这也是错误所指出的,因为您试图将此(短)结果转换为原始数据帧。

您没有指定如何处理最后一行,并且因为您没有可用的data.frame,我可以给出一个示例方法来执行此操作:

log(c(0,data$value)/c(data$value,0))[-1]

最后的[-1]删除了第一个值,因此结果的第一行是log(data$value[1]/data$value[2])

© www.soinside.com 2019 - 2024. All rights reserved.