如何避免循环

jas*_*n K 6 loops r vectorization

全部,我是R.的新手

我有两个面板数据文件,列"id","date"和"ret"

文件A比文件B有更多的数据,但我主要使用文件B数据.

"id"和"date"的组合是unqiue标识符.

是否有一种在B中查找每个(id,date)的优雅方式,我需要从文件A中获取过去10天,然后将它们存回B中?

我天真的做法是循环B中的所有行,

for i in 1:length(B) {
    B$past10d[i] <- prod(1+A$ret[which(A$id == B$id[i] & A$date > B$date[i]-10 & A$date < B$date[i])])-1
}
Run Code Online (Sandbox Code Playgroud)

但循环需要永远.

真的很感激你的想法.

非常感谢你.

Joh*_*ohn 0

这更快吗?(我假设 B$id 和 B$date 的组合是一个唯一标识符,不会在任何地方复制 - 由您的代码暗示)

B$idDate <- factor(B$id):factor(B$date)
B$past10 <- sapply(B$idDate, function(x){with(B[B$idDate == x,], 
    prod(1+A$ret[A$id == id & A$date > date-10 & A$date < date])-1)})
Run Code Online (Sandbox Code Playgroud)