r - 如何向量化一个 "for"循环,该循环在为每个 ID 应用一个函数后返回一个向量

标签 r

我有兴趣找到一种方法来矢量化(使用 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/

相关文章:

r - 在 R 中查找两个向量之间的部分匹配字符串

r - 如何在 R corrgram 中添加轴标签?

r - 使用 tryCatch 在 R 中加载数据文件

r - 如何在r中转换为unix时间?

r - 如何根据数据框名称中间的模式获取数据框列表?

R Shiny 服务器未渲染正确的 ggplot 字体系列

r - 确定最大数量和最长时间间隔

r - 在 R 中制作绘图时,使绘图始终显示原点 (0,0)

r - 解释 R 中 glmnet 中的系数名称

r - R 编程 walk() 函数中的副作用