Как последовательно подгруппировать данные так, чтобы они суммировались до максимальной суммы или меньше? - PullRequest
0 голосов
/ 17 мая 2018

Я в недоумении для кодирования этого в 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 ]

0 голосов
/ 17 мая 2018

Вы можете создать условие подмножества, используя 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
0 голосов
/ 17 мая 2018

Пожалуйста, проверьте следующий код:

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,])
}
...