我有一个数据框,其中有一个股票的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)))
但两个都不起作用,我不知道如何解决它... 希望有人可以帮助我!
答案 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)
for循环可能非常慢。如果可以,尽量避免使用它。
datalen=length(data$price)
data$ratio[2:datalen]=data$price[1:datalen-1]/data$price[2:datalen]
您不需要进行is.NA检查,您将在结果中得到NA,分子或分母为NA。