подмножество данных, основанных на НЕ совокупной сумме строк - PullRequest
1 голос
/ 10 июля 2019

Я хотел бы установить подкадр данных в 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 двумя условиями:

  1. Суммаx2 должно быть меньше 60.

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

1 Ответ

2 голосов
/ 10 июля 2019

Мы могли бы написать функцию для подмножества фрейма данных

subset_df_row <- function(x, x1_value, x2_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 <- df1[sample(seq_len(nrow(df1))), ]
    }
    #Return the subset
    df1[1 : (which.max(cumsum(df1$x2) >= x2_thresh) - 1), ]
}

, а затем динамически передавать x1 и x2 значения фильтра

subset_df_row(x, 2, 60)
#  x1 x2
#6  6 21
#8  8  8

subset_df_row(x, 3, 160)
#  x1 x2
#8  8  8
#5  5 98
#4  4 23
...