将具有不同参数的自身功能应用于数据框

时间:2019-04-16 18:18:33

标签: r dataframe

我在将函数添加到数据框中的列时遇到问题。 我想在不同的时间窗口(例如3个月,6个月等)中计算数据框中列的函数列表(例如求和,平均值,最大值,最小值)。我写了一个带有参数的函数: x-数据 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参数的循环。数据集超过150万条记录,并且要计算40列,我读到循环可能无效。

我尝试使用apply / sapply / mapply函数进行操作-是否可以?我不知道如何使用多个参数执行此功能。这该怎么做?

我正在尝试这样的事情:

sapply(dataForFun$BALANCE_AMT, function(x) {moving_fun(dataForFun$BALANCE_AMT, w = 3 , FUN = sum)})

下面的数据代码。我计算了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"))

0 个答案:

没有答案