我想知道在特定的一天会出现多少只动物。这张图描述了人们预先登记他们的动物。
例如,在7
天前,有人注册了4
只猫以出现在5/3/2019
上;在未来6
天,为9
注册了另一只5/3/2019
猫。因此,7+6=13
上将出现5/3/2019
只猫。
当days_ahead
= 0时,仅表示某人在活动当天进行了注册。例如,4
狼在5/1/2019
(提前0天)注册了5/1/2019
,那么那天将有4
狼。
library(dplyr)
set.seed(0)
animal = c(rep('cat', 5), rep('dog', 6), rep('wolf', 3))
date = sample(seq(as.Date("2019/5/1"), as.Date('2019/5/10'), by='day'), 14, replace=TRUE)
days_ahead = sample(seq(0,14), 14, replace=FALSE)
number = sample.int(10, 14, replace=TRUE)
dt = data.frame(animal, date, days_ahead, number) %>% arrange(animal, date)
预期结果应该与示例中的1-3
列相同,但第四列应该是每个date
的累积数,并累积在days_ahead
上。
我在这里添加了预期的结果。 comments
用于解释accumulated_number
列。
我已经考虑过loop
函数,但不能完全确定如何遍历三个变量(cat,date和days_ahead)。任何建议表示赞赏!
答案 0 :(得分:2)
accumulated_number
使用cumsum()
有点容易。在您的comments
字段中查看此链接:
Cumulatively paste (concatenate) values grouped by another variable
dt%>%
group_by(animal,date)%>%
mutate(accumulated_number = cumsum(number)
,comments = Reduce(function(x1, x2) paste(x1, x2, sep = '+'), as.character(number), accumulate = T)
)%>%
ungroup()
此外,我的数据集与具有相同种子的数据集略有不同。尽管如此,它似乎仍然有效。
# A tibble: 14 x 6
animal date days_ahead number accumulated_number comments
<fct> <date> <int> <int> <int> <chr>
1 cat 2019-05-03 10 9 9 9
2 cat 2019-05-04 6 4 4 4
3 cat 2019-05-06 8 5 5 5
4 cat 2019-05-09 5 4 4 4
5 cat 2019-05-10 13 6 6 6
6 dog 2019-05-01 0 2 2 2
7 dog 2019-05-03 3 5 5 5
8 dog 2019-05-07 1 7 7 7
9 dog 2019-05-07 9 8 15 7+8
10 dog 2019-05-09 12 2 2 2
11 dog 2019-05-10 7 9 9 9
12 wolf 2019-05-02 14 5 5 5
13 wolf 2019-05-03 11 8 8 8
14 wolf 2019-05-07 4 9 9 9
答案 1 :(得分:0)
我不确定我是否理解你的问题,这是你想要的吗?
我要添加“ animals_arriving”列,并保留dt
的其余部分
library(dplyr)
library(lubridate)
dt %>%
mutate(date_arrival = date + days(days_ahead)) %>%
group_by(date = date_arrival) %>%
summarise(animals_arriving = n()) %>%
full_join(dt,by="date")