我有兴趣找到一种方法来矢量化(使用 ddply 或其他一些应用函数)以下内容:
day = seq(0,100,20)
d = data.frame(id=rep(seq(1:10),each=length(day)))
d$s = rnorm(nrow(d),0,1)
d$diffS = NA
for(i in unique(d$id)) {
d$diffS[d$id==i] = c(0,diff(d$s[d$id==i]))
}
本质上,我正在寻找一种更聪明的方法来通过 ID 获取数据帧的子集,应用一个返回向量的函数并将其添加回数据帧。我想也许“by”函数会起作用,但我想不通。
最佳答案
您可以尝试其中之一 aggregating
职能
d$diffS <- with(d, ave(s, id, FUN=function(x) c(0, diff(x))))
或者
library(dplyr)
d %>%
group_by(id) %>%
mutate(diffS= c(0, diff(s)))
或者
library(data.table)#v1.9.5+
setDT(d)[, diffS:= c(0, diff(s)), by = id]
正如@Arun 在评论中提到的,'data.table' 的开发版本有
shift
这会更有效率。安装devel版本的说明是 here
setDT(d)[, diffS := s-shift(s, fill=0), by = id]
关于r - 如何向量化一个 "for"循环,该循环在为每个 ID 应用一个函数后返回一个向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30716830/