提前感谢您的帮助。假设我有这个数据框。
# 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
以来经过的季度数。
再次感谢。
答案 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
tidyverse网站有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