计算r中数据帧中连续值的比率

时间:2015-01-10 18:58:48

标签: r dataframe plyr

我有一个数据框,其中有一个股票的5秒日内数据。数据框存在日期列,一个用于时间,一个用于当时的价格。 我想创建一个新列,计算两个连续价格值的比率。 我尝试使用for循环,但是效果很慢。

data["ratio"]<- 0
i<-2
for(i in 2:nrow(data))
{
  if(is.na(data$price[i])== TRUE){
    data$ratio[i] <- 0
  } else {
    data$ratio[i] <- ((data$price[i] / data$price[i-1]) - 1) 
  }
}

我想知道是否有更快的选项,因为我的数据集包含超过500.000行。 我已经在用ddply尝试了一些东西:

data["ratio"]<- 0
fun <- function(x){
  data$ratio <- ((data$price/lag(data$price, -1))-1)
}
ddply(data, .(data), fun)

和mutate:

data<- mutate(data, (ratio =((price/lag(price))-1)))

但两个都不起作用,我不知道如何解决它... 希望有人可以帮助我!

2 个答案:

答案 0 :(得分:4)

您可以使用lag功能将数据移动一行,然后获取原始数据与移位数据的比率。这是矢量化的,因此您不需要for循环,它应该更快。此外,lag函数中的滞后单元数必须为正数,这可能会导致运行代码时出错。

# Create some fake data
set.seed(5)  # For reproducibility
dat = data.frame(x=rnorm(10))

dat$ratio = dat$x/lag(dat$x,1)

dat
             x       ratio
1  -0.84085548          NA
2   1.38435934 -1.64637013
3  -1.25549186 -0.90691183
4   0.07014277 -0.05586875
5   1.71144087 24.39939227
6  -0.60290798 -0.35228093
7  -0.47216639  0.78314834
8  -0.63537131  1.34565131
9  -0.28577363  0.44977422
10  0.13810822 -0.48327840

答案 1 :(得分:0)

R中的

for循环可能非常慢。如果可以,尽量避免使用它。

datalen=length(data$price)

data$ratio[2:datalen]=data$price[1:datalen-1]/data$price[2:datalen]

您不需要进行is.NA检查,您将在结果中得到NA,分子或分母为NA。