我在将函数添加到数据框中的列时遇到问题。 我想在不同的时间窗口(例如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"))