我目前正在设计R中的最大化算法。我想弄清楚的是,如何将"for each"和"subset by"(更准确地说,"count/sum if")应用于未定义数量的变量(每个变量都在自己的列中)。
对于下面的示例,我将使用具有 3 个变量列的数据集(不包括 ID 和 Category 变量,它们不是最大化过程的一部分)。
library(plyr)
library(dplyr)
sample_data <- cbind(c(1:400), c(rep(1, 20), rep(2, 200), rep(3, 140), rep(4, 40)),
randu[,1]*1000000+1, round(randu[,2]*100,0)+1, randu[,3])
colnames(sample_data) <- c("ID", "Category", "Dollar_Volume", "Count", "Percentage1")
percentiles <- matrix(seq(.01, 1, .01), ncol = 1)
for (c in 3:ncol(sample_data))
{
percentiles <- cbind(percentiles,
matrix(round(quantile(sample_data[,c], seq(.01, 1, .01)), digits = 2), ncol = 1))
}
colnames(percentiles) <- c("Percentile", colnames(sample_data)[3:ncol(sample_data)])
所以现在我想做的基本上是获取我计算的百分位数的所有唯一组合(例如(1st/1st/1st;1st/1st/2nd;...;100th/100th/100th),然后做一个检查,这样:
Ncount <- sum(sample_data[,c] >= PercentileN[,c]
& sample_data[,c + 1] >= PercentileN[,c + 1]
& ...
& sample_data[,ncol(sample_data)] >= PercentileN[,ncol(sample_data)]
)
这基本上只是检查我的"sample_data"行中有多少高于所选的当前百分位数组合,对于 N 参数的每个可能的百分位数组合。
然后,此"Ncount"值以及用于生成该数字的相关参数百分位值将被添加到表中以供以后引用。后面还有其他步骤,但与我卡住的地方无关。
从本质上讲,我的问题归结为如何完成最后一部分 - 我不知道通过可变数量的参数动态"子集"的方法。
任何帮助或想法都非常感谢。
提前感谢!!
我希望我在这里正确理解您---您可以获得所有可能的组合grid.expand
.然后,您可以宁愿使用矢量化来检查所有行的示例数据是否更大。每行组合。
因此,首先检查行值是否更大。然后通过colSums == 3
检查所有值是否都更大
all_combs = t(expand.grid(percentiles[, 2], percentiles[, 3], percentiles[, 4]))
apply(sample_data[, 3:5], 1, function(x) sum(colSums(x >= all_combs) == 3))