R 行的绝对和百分比变化

R 行的绝对和百分比变化,r,R,我有一个数字和因子数据的数据框,我想计算行之间的绝对和百分比变化 df <- data.frame(names=c("A","A","A","A","B","B","B","C","C","C"), x1=c(1:10), x2=c(11:20), x3=c(21:30)) names x1 x2 x3 A 1 11 21 A 2 12 22 A 3 13 23 A 4

我有一个数字和因子数据的数据框,我想计算行之间的绝对和百分比变化

df <- data.frame(names=c("A","A","A","A","B","B","B","C","C","C"),
            x1=c(1:10),
            x2=c(11:20),
            x3=c(21:30))

names   x1  x2  x3
A   1   11  21
A   2   12  22
A   3   13  23
A   4   14  24
B   5   15  25
B   6   16  26
B   7   17  27
C   8   18  28
C   9   19  29
C   10  20  30

任何帮助都将不胜感激。

例如,您可以使用软件包
dplyr

require(dplyr)                   #install the package dplyr and load it into the library

df <- df %.%                           #your data.frame
  group_by(names) %.% 
  mutate(count = 1:n()) %.% 
  mutate(x1.absdif = ifelse(count==1,NA,diff(x1)),
     x2.absdif = ifelse(count==1, NA,diff(x2)),
     x3.absdif = ifelse(count==1, NA,diff(x3)),
     x1.pcndif = ifelse(count==1, NA, x1.absdif/lag(x1,1)),
     x2.pcndif = ifelse(count==1, NA, x2.absdif/lag(x2,1)),
     x3.pcndif = ifelse(count==1, NA, x3.absdif/lag(x3,1))) %.%
  select(-count)

谢谢我一直想开始使用dplyr,所以我想这是一个很好的机会。是否可以计算任意给定数量的列的absdif和pcndif,而不必对每一列进行硬编码?@user3549195我可以想象有一种方法,但不幸的是,目前我不知道这是如何工作的。
require(dplyr)                   #install the package dplyr and load it into the library

df <- df %.%                           #your data.frame
  group_by(names) %.% 
  mutate(count = 1:n()) %.% 
  mutate(x1.absdif = ifelse(count==1,NA,diff(x1)),
     x2.absdif = ifelse(count==1, NA,diff(x2)),
     x3.absdif = ifelse(count==1, NA,diff(x3)),
     x1.pcndif = ifelse(count==1, NA, x1.absdif/lag(x1,1)),
     x2.pcndif = ifelse(count==1, NA, x2.absdif/lag(x2,1)),
     x3.pcndif = ifelse(count==1, NA, x3.absdif/lag(x3,1))) %.%
  select(-count)
#>df
#   names x1 x2 x3 x1.absdif x2.absdif x3.absdif x1.pcndif  x2.pcndif  x3.pcndif
#1      A  1 11 21        NA        NA        NA        NA         NA         NA
#2      A  2 12 22         1         1         1 1.0000000 0.09090909 0.04761905
#3      A  3 13 23         1         1         1 0.5000000 0.08333333 0.04545455
#4      A  4 14 24         1         1         1 0.3333333 0.07692308 0.04347826
#5      B  5 15 25        NA        NA        NA        NA         NA         NA
#6      B  6 16 26         1         1         1 0.2000000 0.06666667 0.04000000
#7      B  7 17 27         1         1         1 0.1666667 0.06250000 0.03846154
#8      C  8 18 28        NA        NA        NA        NA         NA         NA
#9      C  9 19 29         1         1         1 0.1250000 0.05555556 0.03571429
#10     C 10 20 30         1         1         1 0.1111111 0.05263158 0.03448276