这应该是一个相当简单的解决方案,但我并没有因为我的生活能够弄清楚如何解决。
我有一个列,其中包含基于我的数据的某个因子级别组合的累积比例总和,
例如: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
答案 0 :(得分:0)
最后明白,如果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)