Используя данные вашего примера,
library(tidyverse)
adf <- tibble(
project = c("pro1","pro2","pro3"),
`2016` = c(42,96,180),
`2017` = c(36,780,230),
`2018` = c(400,60,0),
`2019` = c(250,900,0)
)
Теперь давайте напишем функцию, которая добавит сумму, заданную указанным годом
previous <- function(data, year){
data%>%gather(Year, Funding, -project)%>%
mutate_at(vars(Year), list(~as.numeric(.)))%>%
split(.$project)%>%
map(~(.)%>%filter(Year <
year)%>%summarise(UQ(paste0("Prior_to_",as.character(year))) :=
sum(Funding)))%>%bind_rows()%>%
bind_cols(data,.)
}
Теперь давайте добавим новый столбец с суммойфинансирования за годы до 2018 года.
> previous(data = adf, year = 2018)
# A tibble: 3 x 6
project `2016` `2017` `2018` `2019` Prior_to_2018
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 pro1 42 36 400 250 78
2 pro2 96 780 60 900 876
3 pro3 180 230 0 0 410
>
Вы также можете использовать group_by()
в функции следующим образом:
previous <- function(data, year){
data%>%gather(Year, value, -project)%>%
mutate_at(vars(Year), list(~parse_number(.)))%>%
group_by(project)%>%
summarise(UQ(paste0("Prior_to_",as.character(year))) :=
sum(value[Year < year]))%>%
left_join(data, ., by = 'project')
}