Как создать инклюзивную функцию биннинга в R? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать функцию, которая объединяет данные на основе нескольких условий. Мои данные имеют две переменные: max_dist и activated.

Функция должна создавать несколько векторов для разных бинов; проверьте, попадает ли max_dist в определенный диапазон, а затем добавьте 1 к вектору, если он попадает в этот диапазон, и activated равно TRUE или 0 к списку, если activated равно FALSE.

Ключевая часть заключается в том, что для каждого наблюдения, если max_dist больше указанного диапазона, но activated также равно TRUE, тогда я хотел бы включить в этот контейнер значение 0. Поэтому некоторые наблюдения с высоким max_dist значения будут объединены несколько раз.

В настоящее время я структурировал это так (сокращенная версия - полная длина - 6 ячеек):

binning_function <- function(df) {
 #create a series of vectors corresponding to bins
  two_hundred <- c()
  four_hundred <- c()

  #iterate through dataframe to add 0 or 1 values to each vector
  for (i in 1:nrow(df)) {
    if (df$activated[i]==TRUE && df$max_dist[i]<=0.2) {
        append(two_hundred, 1)
      }
    else if (df$max_dist[i]>0.2 || df$activated[i]==FALSE) {
        append(two_hundred, 0)
      }
   }

  for (i in 1:nrow(df)) {
    if (df$activated[i]==TRUE && df$max_dist[i]>0.2 && df$max_dist[i]<=0.4) {
        append(four_hundred, 1)
      }
    else if (df$max_dist[i]>0.4 || df$activated[i]==FALSE) {
        append(four_hundred, 0)
      }
  }

return(list(two_hundred,four_hundred))

}

Когда я запускаю эту функцию на фрейме данных, она возвращает список:

[[1]]
NULL

[[2]]
NULL

1 Ответ

0 голосов
/ 29 августа 2018

В приведенном ниже решении используется apply() для одновременного выполнения действия над целым фреймом данных. Это также означает, что вам не нужно начинать пустой вектор заранее. Он также использует ifelse() для сокращения длинных if() {} else {} операторов:

data <- data.frame(row.names = paste0('s',1:100))
 data$max_dist <- runif(100,0,1)
 data$activated <- sample(c(T,F),100,replace=T)

 binning_function <- function(df) {
  two_hundred <- apply(df,1,function(x) {ifelse(x['max_dist']<=0.2 & x['activated'],1,0)})
  four_hundred <- apply(df,1,function(x) {ifelse(x['max_dist']<=0.4 & x['max_dist']>0.2 & x['activated'],1,0)})
  return(list(two_hundred, four_hundred))
}

 binning_function(df=data)
...