组内累计和直到达到阈值

Cumulative sum within group till threshold is reached

我有以下示例数据框:

df <- as.data.frame(cbind(Month <- c("Jun", "Jul", "Aug", "Oct", "Jun", "Aug", "Feb"),ID <- c(1,1,1,2,2,2,2), No_ind <- c(8,5,2,15,10,9,2)))
names(df) <- c('month', 'ID', 'No_ind')

我已经按降序对 No_ind 列进行了排序。我现在想要实现的是以下内容。对于每个组(ID),我想获取组内的所有行,直到个人数量(No_ind)的累计总和达到 15 个人(包括我们命中 15 ind 的行)。我不希望总和超出组边界,而是为每个组重新开始。

然后我希望能够提取达到 15 个人所需的行(月 * 地块组合)。如果算法正确,它选择第1组的所有行(月*地块)组合,只选择第2组的第一个月*地块组合。

非常感谢。非常感谢任何帮助!

您可以对每个 ID 和 select 行求累计和,直到值变为 15。

这可以在 base R 中完成:

subset(df, as.logical(ave(No_ind, ID, FUN = function(x) 
           seq_along(x) <= which.max(cumsum(x) >= 15))))

#  month ID No_ind
#1   Jun  1      8
#2   Jul  1      5
#3   Aug  1      2
#4   Oct  2     15

或在dplyr

library(dplyr)
df %>% group_by(ID) %>% slice(seq_len(which.max(cumsum(No_ind) >= 15)))

data.table

library(data.table)
setDT(df)[, .SD[seq_len(which.max(cumsum(No_ind) >= 15))], ID]

数据

确保将数字视为数字而不是字符串。

df <- type.convert(df, as.is = TRUE)