R 如何为分组表进行变异

R 如何为分组表进行变异,r,dplyr,mutate,R,Dplyr,Mutate,我有这样的abc表 > abc country date count A 2020-03-01 1 A 2020-03-02 2 A 2020-03-03 3 B 2020-03-01 2 B 2020-03-02 5 B 2020-03-03 10 C 2020-03-01 1 C 2020-03-02 3 C 2020-

我有这样的abc表

> abc
country   date      count
A      2020-03-01     1
A      2020-03-02     2
A      2020-03-03     3
B      2020-03-01     2
B      2020-03-02     5
B      2020-03-03     10
C      2020-03-01     1
C      2020-03-02     3
C      2020-03-03     6
我想把“abc”表改成“rate”,意思是“x天的计数/(x-1)-天的计数”

像这样

> abc
country   date      count  rate
A      2020-03-01     1     NA
A      2020-03-02     2     2
A      2020-03-03     3     1.5
B      2020-03-01     2     NA
B      2020-03-02     5     2.5
B      2020-03-03     10    2
C      2020-03-01     1     NA
C      2020-03-02     3     3
C      2020-03-03     6     2
我怎样才能做到


等待您的解决方案:)

您可以在
dplyr
中使用
lag

library(dplyr)
abc %>% group_by(country) %>% mutate(rate = count/lag(count))

#  country date       count  rate
#  <fct>   <fct>      <int> <dbl>
#1 A       2020-03-01     1  NA  
#2 A       2020-03-02     2   2  
#3 A       2020-03-03     3   1.5
#4 B       2020-03-01     2  NA  
#5 B       2020-03-02     5   2.5
#6 B       2020-03-03    10   2  
#7 C       2020-03-01     1  NA  
#8 C       2020-03-02     3   3  
#9 C       2020-03-03     6   2  
library(dplyr)
abc %>%
   group_by(country) %>%
   mutate(rate = c(NA, count[-n()]/count[-1]))
或在底端R中的
头部
/
尾部
,以执行此操作

abc$rate <- with(abc, ave(count, country, FUN = function(x) 
                 c(NA, tail(x, -1)/head(x, -1))))

abc$rate带
dplyr

library(dplyr)
abc %>% group_by(country) %>% mutate(rate = count/lag(count))

#  country date       count  rate
#  <fct>   <fct>      <int> <dbl>
#1 A       2020-03-01     1  NA  
#2 A       2020-03-02     2   2  
#3 A       2020-03-03     3   1.5
#4 B       2020-03-01     2  NA  
#5 B       2020-03-02     5   2.5
#6 B       2020-03-03    10   2  
#7 C       2020-03-01     1  NA  
#8 C       2020-03-02     3   3  
#9 C       2020-03-03     6   2  
library(dplyr)
abc %>%
   group_by(country) %>%
   mutate(rate = c(NA, count[-n()]/count[-1]))

或使用
data.table

library(data.table)
setDT(abc)[, rate := count/shift(count), country]
library(data.table)
setDT(abc)[, rate := c(NA, count[.N]/count[-1]), country]

它正在工作!但它必须改变分子和分母。无论如何,谢谢你:)