如何在R中创建包含式合并功能?

时间:2018-08-29 04:30:26

标签: r function for-loop rstudio binning

我正在尝试创建一个基于多个条件对数据进行装箱的函数。我的数据有两个变量:max_distactivated.

该函数应为不同的容器创建多个向量;检查max_dist是否落在特定范围内,然后将1附加到向量上,如果它在该范围内并且activatedTRUE0如果activatedFALSE,则返回列表。

关键部分是对于每个观察,如果max_dist大于指定范围,但是activated也是TRUE,那么我想在该bin中包括一个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 :(得分:0)

以下解决方案使用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)