R 在数据帧的每个子集内应用函数

R 在数据帧的每个子集内应用函数,r,R,我有一个dataframe,需要计算每个ID内连续条目之间的差异,但我希望这样做,而不必为每个ID创建单独的dataframe,然后再重新连接在一起(我当前的解决方案)。下面是一个使用与数据帧类似的结构的示例 df = as.data.frame(matrix(nrow = 20,ncol =2 )) names(df) = c("ID","number") df$ID = sample(c("A","B","C"),20,replace = T) df$number = rnorm(20,me

我有一个dataframe,需要计算每个ID内连续条目之间的差异,但我希望这样做,而不必为每个ID创建单独的dataframe,然后再重新连接在一起(我当前的解决方案)。下面是一个使用与数据帧类似的结构的示例

df = as.data.frame(matrix(nrow = 20,ncol =2 ))
names(df) = c("ID","number")
df$ID = sample(c("A","B","C"),20,replace = T)
df$number = rnorm(20,mean = 5)
我可以使用这个函数轻松地计算连续行之间的差

roll.dif <-function(x) {
 difference = rollapply(x,width = 2, diff, fill=NA, align = "right")
 return(difference)
}

df$dif = roll.dif(df$number)
我也试过使用

by(df$number,df$ID,FUN = roll.dif)
这两个问题都给了我想要的答案,但我不知道如何让它们回到数据框架中。我希望输出如下所示:

    ID  number       dif
 1  A   3.967251     NA
 2  B   3.771882     NA
 3  A   5.920705     1.953454
 4  A   7.517528     1.596823
 5  B   5.252357     3.771882
 6  B   4.811998    -0.440359
 7  B   3.388951    -1.423047
 8  A   5.284527    -2.233001
 9  C   6.070546     NA
 10 A   5.319934     0.035407
 11 A   5.517615     0.197681
 12 B   5.454738     2.065787
 13 C   6.402359     0.331813
 14 C   5.617123    -0.785236
 15 A   5.692807     0.175192
 16 C   4.902007    -0.715116
 17 B   4.975184    -0.479554
 18 A   6.05282      0.360013
 19 C   3.677114    -1.224893
 20 C   4.883414     1.2063

您可以像这样使用
dplyr

df %>% group_by(ID) %>% mutate(dif=roll.dif(number))

您可以像这样使用
dplyr

df %>% group_by(ID) %>% mutate(dif=roll.dif(number))

我们可以使用
data.table

library(data.table)
setDT(df)[, dif := roll.dif(number), by = ID]

或者
base R
选项是
ave

df$dif <- with(df, ave(number, ID, FUN = roll.dif))

df$dif我们可以使用
数据表

library(data.table)
setDT(df)[, dif := roll.dif(number), by = ID]

或者
base R
选项是
ave

df$dif <- with(df, ave(number, ID, FUN = roll.dif))
df$dif