具有包含截止值的子集数据帧而不是排他性

时间:2018-01-23 00:32:30

标签: r subset

这应该是一个相当简单的解决方案,但我并没有因为我的生活能够弄清楚如何解决。

我有一个列,其中包含基于我的数据的某个因子级别组合的累积比例总和,

例如: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

1 个答案:

答案 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)