这应该是一个相当简单的解决方案,但是我一生中都没有办法解决。
我有一列,其中包含基于数据因素集的某种组合的比例的累积和,
例如:0.34、0.57、0.66、0.68、0.73、0.81、0.90、0.97、0.98、0.99,
然后数据移至下一个因子组合并重置累计和,
例如:0.27、0.29、0.38、0.56、0.78、0.94、0.96、0.97、0.98等。
对于以下两个因素的组合,我使用以下公式进行了计算:
DF$CumSum <-ave(DF$Proportion, DF$Factor1, DF$Factor2, FUN = "cumsum")
我想将数据的子集设置为0.95的截止值,这样就排除了超过此阈值的比例越来越小的行,因为在累积求和之前,数据是按比例顺序排列的。问题是,如果我有如下一组比例,
例如:0.58、0.97、0.98、0.99,
然后通过将阈值设为0.95,在这种情况下,我排除了0.39的比例,这是很大的,我将被保留下来,
例如:0.58
尽管0.97超过阈值(0.95),但前一行低于阈值(0.58)。我希望排除第一行之后高于0.95的因子水平组合。
有没有一种方法可以使用不同的子集设置技术,以便在这种情况下,可以将包含该值的数据子集化?例如。输出将是:0.58,0.97,而不增加我的截止阈值。我试图在for循环内实现ifelse语句,但没有成功。这是我想出的:
Threshold <- 0.95
for(i in 2:length(DF$Index)) {
DF[i] <- ifelse(DF$CumSum[i-1] < Threshold & DF$CumSum[i] >= Threshold,
DF[-i,], DF[i])
}
示例数据:
Index Factor1 Factor2 Proportion CumSum
1 A A 0.3 0.3
2 A A 0.2 0.5
3 A A 0.1 0.6
4 A A 0.05 0.65
5 A A 0.03 0.68
6 A A 0.01 0.69
7 A B 0.4 0.4
8 A B 0.3 0.7
9 A B 0.2 0.9
10 A B 0.05 0.95
11 A B 0.03 0.98
12 A B 0.002 0.982
13 A B 0.001 0.983
14 B A 0.35 0.35
15 B A 0.2 0.55
16 B A 0.12 0.67
17 B A 0.06 0.73
18 B A 0.04 0.77
19 B B 0.6 0.6
20 B B 0.3 0.9
21 B B 0.08 0.98
最终理解,仅当prev值大于0.95时才要排除。以下应该工作:
DF$CumSum <- ave(DF$Proportion, DF$Factor1, DF$Factor2, FUN = "cumsum")
do.call(rbind, by(DF, paste(DF$Factor1, DF$Factor2), function(subDF) {
subDF[c(TRUE, (dplyr::lag(subDF$CumSum) <= 0.95)[-1]),]
}))
# Index Factor1 Factor2 Proportion CumSum
#A A.1 1 A A 0.30 0.30
#A A.2 2 A A 0.20 0.50
#A A.3 3 A A 0.10 0.60
#A A.4 4 A A 0.05 0.65
#A A.5 5 A A 0.03 0.68
#A A.6 6 A A 0.01 0.69
#A B.7 7 A B 0.40 0.40
#A B.8 8 A B 0.30 0.70
#A B.9 9 A B 0.20 0.90
#A B.10 10 A B 0.05 0.95
#B A.14 14 B A 0.35 0.35
#B A.15 15 B A 0.20 0.55
#B A.16 16 B A 0.12 0.67
#B A.17 17 B A 0.06 0.73
#B A.18 18 B A 0.04 0.77
#B B.19 19 B B 0.60 0.60
#B B.20 20 B B 0.30 0.90
#B B.21 21 B B 0.08 0.98
Df <- read.table(text="Index Factor1 Factor2 Proportion CumSum
1 A A 0.3 0.3
2 A A 0.2 0.5
3 A A 0.1 0.6
4 A A 0.05 0.65
5 A A 0.03 0.68
6 A A 0.01 0.69
7 A B 0.4 0.4
8 A B 0.3 0.7
9 A B 0.2 0.9
10 A B 0.05 0.95
11 A B 0.03 0.98
12 A B 0.002 0.982
13 A B 0.001 0.983
14 B A 0.35 0.35
15 B A 0.2 0.55
16 B A 0.12 0.67
17 B A 0.06 0.73
18 B A 0.04 0.77
19 B B 0.6 0.6
20 B B 0.3 0.9
21 B B 0.08 0.98", header=TRUE)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句