Применение собственной функции с различными параметрами к фрейму данных - PullRequest
0 голосов
/ 16 апреля 2019

У меня проблема с применением моей функции к столбцам в фрейме данных. Я хотел бы рассчитать список функций для столбца во фрейме данных (например, сумма, среднее, максимальное, минимальное) в разных временных окнах (например, 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...