如何在 R 数据帧中按组查找每行值与上一行的差值?
在数据分析中,有时我们需要找出当前值与前一个值之间的差值,而且可能也需要分组找出。它有助于我们比较值之间的差异。在 R 中,我们可以使用 dplyr 包的 group_by 和 mutate 函数与滞后一起使用。
示例
考虑一下下面的数据帧 −
> Group<-rep(LETTERS[1:5],each=4) > Frequency<-sample(1:20,20,replace=TRUE) > df1<-data.frame(Group,Frequency) > df1
输出
Group Frequency 1 A 7 2 A 6 3 A 9 4 A 12 5 B 19 6 B 19 7 B 4 8 B 6 9 C 14 10 C 6 11 C 6 12 C 20 13 D 2 14 D 11 15 D 14 16 D 19 17 E 14 18 E 7 19 E 3 20 E 1
加载 dplyr 包 −
> library(dplyr)
按组从每行减去频率 −
> df1%>%group_by(Group)%>%mutate(Difference=Frequencylag(Frequency,default=first(Frequency))) # A tibble: 20 x 3 # Groups: Group [5]
输出
Group Frequency Difference <fct> <int> <int> 1 A 7 0 2 A 6 -1 3 A 9 3 4 A 12 3 5 B 19 0 6 B 19 0 7 B 4 -15 8 B 6 2 9 C 14 0 10 C 6 -8 11 C 6 0 12 C 20 14 13 D 2 0 14 D 11 9 15 D 14 3 16 D 19 5 17 E 14 0 18 E 7 -7 19 E 3 -4 20 E 1 -2
让我们看另一个示例 −
示例
> x<-rep(c("S1","S2","S3","S4","S5"),times=4) > y<-rnorm(20) > df2<-data.frame(x,y) > df2
输出
x y 1 S1 -0.2648554 2 S2 -1.6024447 3 S3 -0.3668267 4 S4 0.6439787 5 S5 1.9406125 6 S1 1.8398485 7 S2 1.5151748 8 S3 -0.7975164 9 S4 -1.4744469 10 S5 -0.4300237 11 S1 -1.2181901 12 S2 -0.9504064 13 S3 1.0594684 14 S4 -0.3190330 15 S5 -0.4186285 16 S1 0.2418591 17 S2 0.4273363 18 S3 1.2725779 19 S4 0.1008520 20 S5 0.0362863
> df2%>%group_by(x)%>%mutate(Difference=y-lag(y,default=first(y))) # A tibble: 20 x 3 # Groups: x [5]
输出
x y Difference <fct> <dbl> <dbl> 1 S1 -0.265 0 2 S2 -1.60 0 3 S3 -0.367 0 4 S4 0.644 0 5 S5 1.94 0 6 S1 1.84 2.10 7 S2 1.52 3.12 8 S3 -0.798 -0.431 9 S4 -1.47 -2.12 10 S5 -0.430 -2.37 11 S1 -1.22 -3.06 12 S2 -0.950 -2.47 13 S3 1.06 1.86 14 S4 -0.319 1.16 15 S5 -0.419 0.0114 16 S1 0.242 1.46 17 S2 0.427 1.38 18 S3 1.27 0.213 19 S4 0.101 0.420 20 S5 0.0363 0.455
广告