代码之家  ›  专栏  ›  技术社区  ›  James Picerno

如何按顺序将数据子集,使其总和达到或小于最大总和?

  •  1
  • James Picerno  · 技术社区  · 8 年前

    我对在R中编写此代码感到不知所措。如有任何帮助,将不胜感激。我试图对几个数据帧进行子集划分,每个数据帧包含数百行数据。子集规则:按顺序分析数据(从上到下),以便结果反映所有与预先选择的最大值或更小值相加的行(如果不匹配,则最接近最大值)。输出应该保留行和相关列的顺序,直到该点。

    作为我努力实现的一个微不足道的例子:

    set.seed(78) # for reproducibility
    dat <- as.data.frame(matrix(c(0.1, 0.2, 0.5, 0.8, 1.1)), ncol = 1, nrow = 5)
    dat$type <-c("ABC", "DEF", "GHI", "JKL", "MNO")
    
    dat
       V1 type
    1 0.1  ABC
    2 0.2  DEF
    3 0.5  GHI
    4 0.8  JKL
    5 1.1  MNO
    

    假设目标是按顺序子集 dat 因此V1列的和等于或小于1.6。在这种情况下,输出如下:

        V1 type
    1 0.1  ABC
    2 0.2  DEF
    3 0.5  GHI
    4 0.8  JKL
    

    当然,在本例中手动查找此结果并不重要:

    dat[1:4,]
    
       V1 type
    1 0.1  ABC
    2 0.2  DEF
    3 0.5  GHI
    4 0.8  JKL
    

    当然,总数为1.6:

    sum(dat[1:4,1])
    [1] 1.6
    

    我如何在R中以编程方式对其进行编码,以便在多个数据帧上运行此分析,每个数据帧都有几十行或数百行,每个数据帧都有不同的最大值目标?谢谢

    2 回复  |  直到 8 年前
        1
  •  2
  •   digEmAll    8 年前

    可以使用创建子集条件 cumsum ,例如:

    s <- dat[cumsum(dat$V1) <= 1.6,]
    
    > s
       V1 type
    1 0.1  ABC
    2 0.2  DEF
    3 0.5  GHI
    4 0.8  JKL
    
        2
  •  0
  •   Pavel Paltsev    8 年前

    请检查以下代码:

    dataframes <- c("dat1", "dat2")
    lim <- c(1.6, 1)
    dat1 <- data.frame( dat = c(0.1, 0.2, 0.5, 0.8, 1.1), type = c("ABC", "DEF", "GHI", "JKL", "MNO"))
    dat2 <- data.frame( dat = c(0.1, 0.2, 0.5, 0.8, 1.1), type = c("ABC", "DEF", "GHI", "JKL", "MNO"))
    for (i in 1:length(dataframes))
    {data <- get(dataframes[i])
    maxitem <- max(which(cumsum(dat$dat)<= lim[i])) 
    print(data[1:maxitem,])
    }