首页 文章

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

提问于
浏览
1

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

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

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

    终于明白,如果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)
    

相关问题