我有一个带有两列(股票名称和价格)的dataframe df:
| 名称|价格|
| --------------|--------------|
| A|第二章|
| A|三|
| A|四|
| A|四|
| B|七|
| B|六|
| C|三|
等等
我需要一个函数来添加另一个列,显示在n个以前的记录的变化率,分别为每个NAME组计算。当记录少于n时,则结果应包括给定组中可用数据的最大数量。例如:RateofChange(1)应添加以下内容:
| 名称|价格|ROC1|
| --------------|--------------|--------------|
| A|第二章|0|
| A|三|0.5分|
| A|四|0.33|
| A|四|0|
| B|七|0|
| B|六| -0.14 |
| C|三|0|
而RateofChange(2)应导致:
| 名称|价格|ROC2|
| --------------|--------------|--------------|
| A|第二章|0|
| A|三|0.5分|
| A|四|1|
| A|四|0.33|
| B|七|0|
| B|六| -0.14 |
| C|三|0|
我有下面的函数可以工作,但它非常慢(我需要计算230万条记录,需要几个小时)。可以使用向量/滞后函数等更有效地重写它吗?
RateofChange1<- function(n){
nmax=nrow(df)
newvarname<-paste("ROC",n,sep="")
for (i in (n+1):nmax){
l=0
for (k in 1:n){
if (df$NAME[i]==df$NAME[i-k]){l=k}
}
if (l>0){df[i,newvarname]<<-(df$PRICE[i]-df$PRICE[i-l])/df$PRICE[i-l]}
}
}
2条答案
按热度按时间x4shl7ld1#
我认为您可以在每组
NAME
中尝试以下操作例如,对于
data.table
,你最终会得到
数据
jm81lzqq2#
你可以利用跑步者和崩溃来获得更快的速度。
如果没有n的限制,你可以简单地使用
collapse::flag()
,这将比下面的例子快得多。创建于2023-03-28带有reprex v2.0.2