使用列表

时间:2017-08-28 15:37:56

标签: r

我有原始数据集(1100000 * 62),我需要根据手动过滤器划分数据。

我创建了一个可以通过手动输入参数来分离数据的功能:它采用以下参数。

segment_dat <- function(data, Region, gtv_class_bracket, hotelclass){...}

要求:数据子集应在以下参数上:

  1. 数据[[1]]应基于NORTH-GTV1-0.5
  2. 数据[[2]]应基于NORTH-GTV1-5
  3. ...

        
    1. 数据[[120]]应基于SOUTH-GTV5-5
    2. 我对迭代循环有点新意。 我找到了多个线程,我能够编写下面的代码,但它现在没有用。最终目的是将每个数据集提供给另一个编写的函数进行聚类分析。如果您有任何线索,请提供帮助。基本上我需要迭代三个列表reg,gtv,hc。数据集的数量 应该是120。

      #####################################################################
      ############     adding segment_dat    code#########################
      
      
      segment_dat<-function(data,Region,gtv_class_bracket,hotelclass) {
      
        ##############################if no parameters  are missing #############################
        if ( !missing(Region) & !missing(gtv_class_bracket) &!missing(hotelclass)){
          data1<-data[data$region==Region & data$gtv_class_bracket==gtv_class_bracket &
                        data$hotelclass==hotelclass,]
        }
        #################################################################################################
        ################### if two of the parameters are missing #######################################
        else if(missing(gtv_class_bracket) & missing(hotelclass) & !missing(Region)) {
          data1<-data[data$region==Region,]
      
        }
      
        else if (missing(Region) & missing(hotelclass) & !missing(gtv_class_bracket)){
          data1<-data[data$gtv_class_bracket==gtv_class_bracket,]
        }
      
        else if (missing(Region) & missing(gtv_class_bracket) & !missing(hotelclass))
        {
          data1<-data[data$hotelclass==hotelclass,]
        }
      
        ###########################################################################################  
        ######################## If any one of the parameter is missing ###########################
        else if (missing(gtv_class_bracket)){
          data1<-data[data$hotelclass==hotelclass & data$region==Region,]
      
        }
        else if (missing(hotelclass)){
          data1<-data[data$gtv_class_bracket==gtv_class_bracket & data$region==Region,]
        }
        else if (missing(Region)){
          data1<-data[data$gtv_class_bracket==gtv_class_bracket & data$hotelclass==hotelclass,]
      
        }
      }
      
      # example data
      data=list()
      reg<-as.list(c("NORTH","EAST","WEST","SOUTH"))
      gtv<-as.list(c("GTV1","GTV2","GTV3","GTV4","GTV5"))
      hc<-as.list(c(0.5,1,2,3,4,5))
      #xx<-data.frame()
      for (i in 1:length(reg)){
        for(j in 1:length(gtv)){
          j=i
          for(k in 1:length(hc)){
            k=j
              data[[i]]<-segment_dat(hotel_clus3,Region=reg[[i]],
                         gtv_class_bracket=gtv[[j]],hotelclass=hc[[k]])   
          }} }
      

1 个答案:

答案 0 :(得分:1)

以下是segment_dat()功能的替代品。调用它不需要三重for循环。在函数下方,它会在您的数据上调用。

segment_dat <- function(data, region, gtv_class_bracket, hotelclass){
    ## Build inputs list while checking for missing inputs
    inputs <- list()
    if(!missing(region)) inputs <- list(region=region)
    if(!missing(gtv_class_bracket) inputs <- c(inputs, list(gtv_class_bracket=gtv_class_bracket))
    if(!missing(hotelclass)) inputs <- c(inputs, hotelclass=hotelclass)
    if(inputs == 0) stop("Some subsetable column is required as input.")

    ## Build permutation data.frame
    inputs['stringsAsFactors'] <- FALSE
    values <- do.call(expand.grid, inputs)

    ## Generate list of data.frames
    apply(vals, 1, function(x) merge(data, x))
}

data <- segment_dat(hotel_clus3, reg, gtv, hc)

修改

替换了代码中不存在的变量;现在都应该工作了。