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