сумма после вычитания первого элемента определенного столбца со всеми элементами другого столбца и повторения с 2 элементами и так далее в R программировании - PullRequest
0 голосов
/ 28 мая 2019

Я хотел бы сложить после вычитания всех элементов datetamp-1 1-й элемент datetamp-2 и повторить то же самое для 2-го элемента datetamp-2 и т. Д. В R

datestamp1 datestamp2 load_percent
2019-05-28 2019-05-25 0.01883
2019-05-29 2019-05-26 0.72340

Ожидаетсярезультат, как указано ниже.

datestamp1 datestamp2 weighted_index
2019-05-28 2019-05-25 2.95
2019-05-29 2019-05-26 2.20

Логика

1. 2019-05-28 - 2019-05-25 = 3 * 0.01 = 0.056 
2. 2019-05-29 - 2019-05-25 = 4 * 0.72 = 2.893

сумма 0,056 и 2,893 равна 2,95

аналогично

3. 2019-05-28 - 2019-05-26 = 2 * 0.01 = 0.037
4. 2019-05-29 - 2019-05-26 = 3 * 0.72 = 2.170

исумма 0,037 и 2,170 составляет 2,20

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Мы можем использовать outer, чтобы получить разницу между двумя столбцами даты, а затем получить colSums продукта с 'load_percent'

df1$weighted_index <- with(df1, colSums(outer(datestamp1, 
          datestamp2, FUN = `-` ) * load_percent))

df1
#  datestamp1 datestamp2 load_percent weighted_index
#1 2019-05-28 2019-05-25      0.01883        2.95009
#2 2019-05-29 2019-05-26      0.72340        2.20786

data

df1 <- structure(list(datestamp1 = structure(c(18044, 18045), class = "Date"), 
    datestamp2 = structure(c(18041, 18042), class = "Date"), 
    load_percent = c(0.01883, 0.7234)), row.names = c(NA, -2L
), class = "data.frame")
0 голосов
/ 28 мая 2019

Используя sapply, вы можете сделать

df$weighted_index <- sapply(df$datestamp2, function(x) 
                            sum((df$datestamp1 - x) * df$load_percent))

df
#  datestamp1 datestamp2 load_percent weighted_index
#1 2019-05-28 2019-05-25      0.01883        2.95009
#2 2019-05-29 2019-05-26      0.72340        2.20786

Убедитесь, что ваши столбцы datestamp1 и datestamp2 относятся к классу Date.Если они не преобразуют их сначала в дату, а затем используйте приведенный выше код.

 df[1:2] <- lapply(df[1:2], as.Date)
...