У меня проблема с применением моей функции к столбцам в фрейме данных.
Я хотел бы рассчитать список функций для столбца во фрейме данных (например, сумма, среднее, максимальное, минимальное) в разных временных окнах (например, 3 месяца, 6 месяцев и т. Д.). Я написал функцию с параметрами:
х - данные
w - окно
FUN - функция для расчета
moving_fun <- function(x, w , FUN , NAs = F, ...) {
if (w < 1) {
stop("w parameter must be > 0")
}
output <- x
for (i in 1:length(x)) {
lower_bound <- i - w + 1
if (lower_bound < 1) {
output[i] <- FUN(x[1:i, ...])
} else {
output[i] <- FUN(x[lower_bound:i, ...])
}
}
output
}
Я пытаюсь избежать циклов для различных параметров W и FUN. Набор данных содержит более 1,5 млн записей и, как 40 столбцов для расчета, я прочитал, что циклы могут быть неэффективными.
Я пытаюсь сделать это с помощью функций apply / sapply / mapply - возможно ли это? Я не знаю, как выполнить эту функцию с несколькими параметрами. Как это сделать?
Я пытаюсь что-то вроде этого:
sapply(dataForFun$BALANCE_AMT, function(x) {moving_fun(dataForFun$BALANCE_AMT, w = 3 , FUN = sum)})
Код для данных ниже. Я рассчитываю 3-месячные средние значения, сгруппированные по клиентам, с разбивкой по месяцам по возрастанию. Если его первый месяц клиента тогда рассчитывается, среднее значение рассчитывается только для этого месяца, затем для двух, а затем его скользящее среднее для окна за 3 месяца:
structure(list(CST_ID = c(345, 345, 345, 345, 345, 345, 345,
345, 345, 345, 345, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
1345, 1345, 1345, 1345, 1345), MONTH_LAST_DATE = structure(c(1556582400,
1559260800, 1561852800, 1564531200, 1567209600, 1569801600, 1572480000,
1575072000, 1577750400, 1580428800, 1582934400, 1556582400, 1559260800,
1561852800, 1564531200, 1567209600, 1569801600, 1572480000, 1575072000,
1577750400, 1580428800, 1582934400, 1585612800), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), BALANCE_AMT = c(1160.26, 4155.69,
145.4, 793.41, 626.88, 4387.91, 3287.01, 4864.89, 1232.69, 2137.81,
442.03, 2372.87, 1766.91, 2319.87, 4966.47, 4914.29, 3829.45,
3880.91, 2010.24, 3145.31, 3864.87, 4917.15, 3392.6), MEAN_3MON_PER_CST = c(1160.26,
2657.975, 1820.45, 1698.16666666667, 521.896666666667, 1936.06666666667,
2767.26666666667, 4179.93666666667, 3128.19666666667, 2745.13,
1270.84333333333, 2372.87, 2069.89, 2153.21666666667, 3017.75,
4066.87666666667, 4570.07, 4208.21666666667, 3240.2, 3012.15333333333,
3006.80666666667, 3975.77666666667, 4058.20666666667)), .Names = c("CST_ID",
"MONTH_LAST_DATE", "BALANCE_AMT", "MEAN_3MON_PER_CST"), row.names = c(NA,
-23L), class = c("tbl_df", "tbl", "data.frame"))