Я хотел бы установить подкадр данных в r на основе НЕ совокупной суммы строк и большего количества условий.
Например, у меня есть следующий фрейм данных:
x<-data.frame(x1=c(1,2,3,4,5,6,7,8,9),x2=c(70,1,6,23,98,21,45,8,6))
Теперь я хотел бы задать x двумя условиями:
Суммаx2 должно быть меньше 60.
x1 должно быть больше 2.
Итак, я попытался:
subset(x, cumsum(x2)<60 & x1>2)
Очевидно, мой код не работает (он возвращает пустой фрейм данных), потому что я пытаюсь использовать cumsum, а первый элемент x2 уже больше 60.
Я ожидаю один фрейм данных, который может выглядетьнапример:
x1 x2
3 3 6
4 4 23
6 6 21
8 8 8
, поскольку сумма значений x2 меньше 60, а значение x1 больше 2.
Поскольку решение является динамическим, другим возможным результатом может быть:
x1 x2
7 7 45
8 8 8
9 9 6
Или:
x1 x2
3 3 6
Как только я пойму, как его реализовать, я ограничу набор возможных решений, добавив больше условий.
РЕДАКТИРОВАТЬ для Ронак Шаха
Дополнительный столбец x3, поэтому кадр данных x становится:
x<-data.frame(x1=c(1,2,3,4,5,6,7,8,9),x2=c(70,1,6,23,98,21,45,8,6),x3=c(13,2,31,45,5,6,7,18,0))
Сумма x3 должна быть меньшеn 20, поэтому x3_tresh должен 20.
РЕШЕНИЕ ИЗМЕНЕНО
subset_df_row <- function(x, x1_value, x2_thresh, x3_thresh) {
#Filter the dataframe based on x1_value
df1 <- x[x$x1 > x1_value, ]
#Shuffle rows to get random result
df1 <- df1[sample(seq_len(nrow(df1))), ]
#If the first value of x2 is greater than threshold shuffle again
while(df1$x2[1] >= x2_thresh || df1$x3[1] >= x3_thresh) {
df1 <- df1[sample(seq_len(nrow(df1))), ]
}
#Return the subset
df1[1 : min((which.max(cumsum(df1$x2) >= x2_thresh) - 1),
(which.max(cumsum(df1$x3) >= x3_thresh) - 1)), ]
}