Сумма по нескольким таймфреймам с использованием R - PullRequest
3 голосов
/ 01 мая 2020

У меня есть два кадра данных, х и у. Фрейм данных x имеет диапазон дат, в то время как фрейм данных y имеет отдельные даты. Я хочу получить сумму отдельных значений даты для диапазонов времени во фрейме данных x. Таким образом, id a будет иметь сумму всех значений с 2019/1/1 по 2019/3/1.

id <- c("a","b","c")
start_date <- as.Date(c("2019/1/1", "2019/2/1", "2019/3/1"))
end_date <- as.Date(c("2019/3/1", "2019/4/1", "2019/5/1"))
x <- data.frame(id, start_date, end_date)

dates <- seq(as.Date("2019/1/1"),as.Date("2019/5/1"),1)
values <- runif(121, min=0, max=7)

y <- data.frame(dates, values)

Желаемый результат

id start_date end_date  sum
a  2019/1/1   2019/3/1  221.8892

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Одна базовая опция R использует apply

x$sum <- apply(x, 1, function(v) sum(subset(y,dates >= v["start_date"] & dates<=v["end_date"])$values))

, так что

> x
  id start_date   end_date      sum
1  a 2019-01-01 2019-03-01 196.0311
2  b 2019-02-01 2019-04-01 185.6970
3  c 2019-03-01 2019-05-01 173.6429

Данные

set.seed(1234)
id <- c("a","b","c")
start_date <- as.Date(c("2019/1/1", "2019/2/1", "2019/3/1"))
end_date <- as.Date(c("2019/3/1", "2019/4/1", "2019/5/1"))
x <- data.frame(id, start_date, end_date)

dates <- seq(as.Date("2019/1/1"),as.Date("2019/5/1"),1)
values <- runif(121, min=0, max=7)

y <- data.frame(dates, values)
1 голос
/ 01 мая 2020

Есть много способов сделать это. Один из возможных вариантов:

library(data.table)
x <- setDT(x)

# create a complete series for each id
x <- x[, .(dates = seq(start_date, end_date, 1)), by=id]


# merge the data
m <- merge(x, y, by="dates")

# get the sums
m[, .(sum = sum(values)), by=id]
   id      sum
1:  a 196.0311
2:  b 185.6970
3:  c 173.6429

Вы можете добавить setseed перед созданием случайных переменных, чтобы точно повторить числа

set.seed(1234)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...