В основном, используя tapply
, получая год из первых четырех символов substr
ing.
data.frame(days=with(dat, tapply(days, substr(date, 1, 4), sum)))
# days
# 2018 212
# 2019 212
Если в столбце указан год, вероятно, лучше использовать aggregate
.
with(dat, aggregate(list(days=days), list(date=substr(date, 1, 4)), sum))
# date days
# 1 2018 212
# 2 2019 212
Чтобы получить перевод год назад, мы могли бы написать функцию fun
, которая вычитает, чтобы получить переводы tr
.
fun <- function(d) d - as.Date(paste0(substr(d, 1, 4), "-01-01"))
tr <- with(dat, as.numeric(days - fun(date)))
tapply
решение:
res <- data.frame(days=with(dat, tapply(days, substr(date, 1, 4), sum)))
transform(res, days=days + tr[tr > 0] * c(1, -1))
# days
# 2018 334
# 2019 90
Аналогично с использованием aggregate
:
res2 <- with(dat, aggregate(list(days=days),
list(date=substr(date, 1, 4)), sum))
transform(res2, days=days + tr[tr > 0] * c(1, -1))
# date days
# 1 2018 334
# 2 2019 90
Данные:
dat <- structure(list(date = structure(c(17563, 17683, 17713, 17775,
17928, 17956, 17987), class = "Date"), days = c(0, 120, 30, 62,
153, 28, 31)), class = "data.frame", row.names = c(NA, -7L))