Dplyr - 自第一次事件以来的时间段

时间:2018-01-31 17:42:31

标签: r dplyr

提前感谢您的帮助。假设我有这个数据框。

# install.packages(c("tidyverse"), dependencies = TRUE)
require(tidyverse)
test <- tibble(id=c(1,1,1,2,2,2),
               event=c("dog","cat","mouse","cat","mouse","dog"),
               quarter=(c(1,5,8,4,5,9)))
test
#> # A tibble: 6 x 3
#>      id event quarter
#>   <dbl> <chr>   <dbl>
#> 1     1   dog       1
#> 2     1   cat       5
#> 3     1 mouse       8
#> 4     2   cat       4
#> 5     2 mouse       5
#> 6     2   dog       9

我想使用dplyr来结束以下数据框,以便对于每个给定的id,我知道从第一个开始就已经过去的quarters的数量事件

test %>% cbind(quarterFrom = c(0,5,8,0,1,5)) %>% as_tibble()
#> # A tibble: 6 x 4
#>      id event quarter quarterFrom
#>   <dbl> <chr>   <dbl>       <dbl>
#> 1     1   dog       1           0
#> 2     1   cat       5           5
#> 3     1 mouse       8           8
#> 4     2   cat       4           0
#> 5     2 mouse       5           1
#> 6     2   dog       9           5

您可以看到,对于id == 1,第一季度为1,并且会收到quarterFrom == 0。但是对于id == 2,第一季度为4,并且还应该收到quarterFrom == 0。从那时起,给定id的所有其他条目都是自quarterFrom == 0以来经过的季度数。

再次感谢。

2 个答案:

答案 0 :(得分:2)

我意识到我的计数与你的计数有点不同,但这只是因为我没有100%遵循你的逻辑。也许你可以澄清,我可以更新回应。

test %>% group_by(id) %>% mutate(quarterFrom = quarter- first(quarter))
#> # A tibble: 6 x 4
#> # Groups:   id [2]
#>      id  event quarter quarterFrom
#>   <dbl> <fctr>   <dbl>       <dbl>
#> 1     1    dog       1           0
#> 2     1    cat       5           4
#> 3     1  mouse       8           7
#> 4     2    cat       4           0
#> 5     2  mouse       5           1
#> 6     2    dog       9           5

网站有further illustrative examples of how to extract the first, last or nth value from a vector

我刚看到thc发布了一个或多或少相同的解决方案。我认为答案也很完美 - 显然他是 - 或者她? - 也被计数搞糊涂了。

答案 1 :(得分:1)

我认为你的示例输出在id = 1或id = 2时有一个错误。如果是这样,您可以通过在此dplyr解决方案中添加或减去1进行调整:

test %>% group_by(id) %>% mutate(quarterFrom = quarter-min(quarter))

     id  event quarter quarterFrom
  <dbl> <fctr>   <dbl>       <dbl>
1     1    dog       1           0
2     1    cat       5           4
3     1  mouse       8           7
4     2    cat       4           0
5     2  mouse       5           1
6     2    dog       9           5