组内累计和直到达到阈值
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)
我有以下示例数据框:
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)