как мутировать для сгруппированной таблицы - PullRequest
1 голос
/ 29 марта 2020

у меня есть таблица 'ab c', подобная этой,

> 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

, и я хочу преобразовать таблицу 'ab c' в значение 'rate', что означает «счет Х-дня / (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

как мне это сделать?

в ожидании вашего решения :)

Ответы [ 2 ]

1 голос
/ 29 марта 2020

С dplyr

library(dplyr)
abc %>%
   group_by(country) %>%
   mutate(rate = c(NA, count[-n()]/count[-1]))

Или с использованием data.table

library(data.table)
setDT(abc)[, rate := c(NA, count[.N]/count[-1]), country]
1 голос
/ 29 марта 2020

Вы можете использовать lag в 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  

shift в data.table

library(data.table)
setDT(abc)[, rate := count/shift(count), country]

или head / tail в базе R для сделай это.

abc$rate <- with(abc, ave(count, country, FUN = function(x) 
                 c(NA, tail(x, -1)/head(x, -1))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...