2017-08-28 47 views
0

我有原始數據集的大小(1100000 * 62),我需要根據手動過濾器劃分數據。使用列表中定義的過濾器從原始數據框中獲取子集數據

我已經創建了一個函數,可以通過手動輸入參數來分開數據:它取下面的參數。

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

要求:數據的子集應當是如下參數:

  1. 數據[[1]]應根據NORTH-GTV1-0.5
  2. 數據[[2]]應該是基於NORTH-GTV1-5

...

  • 數據[[120]]應該基於南-GTV5-5
  • 我對迭代循環有點新。 我已經找到了多個線程,並且我能夠在代碼之下編寫代碼,但從現在開始它並沒有什麼幫助。最終目標是爲寫入的另一個函數提供每個數據集以進行聚類分析。請幫忙,如果你有任何線索。基本上我需要重複三個列表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]]) 
        }} } 
    
    +0

    在特定列下是「NORTH」嗎? 「GTV1」是否在特定列下?是「0.5」等? – CPak

    +0

    您需要將數據[[i]]更改爲data [[paste(j,i,k,sep =「」)]]]。否則,數據[[i]]將不斷寫入,直到最後一個j = 5和k = 6。 – user108363

    +0

    你可以在你的問題中包含'segment_dat()'函數的內容嗎? – dvantwisk

    回答

    1

    這裏是爲您segment_dat()功能的替代品。不需要三重for-loop來調用它。在函數下面,它會在您的數據上被調用。

    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) 
    

    編輯

    替換變量不存在在你的代碼;現在都應該工作。

    相關問題