【问题标题】:Subset data from original data frame using filters defined in lists使用列表中定义的过滤器从原始数据框中子集数据
【发布时间】:2017-08-29 03:59:28
【问题描述】:

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

我创建了一个可以通过手动输入参数来分离数据的函数:它需要以下参数。

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

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

  1. data[[1]] 应该基于 NORTH-GTV1-0.5
  2. data[[2]] 应该基于 NORTH-GTV1-5

...

  1. 数据[[120]]应该基于SOUTH-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]])   
    }} }

【问题讨论】:

  • 特定列下是否有“NORTH”? “GTV1”是否在特定列下?是“0.5”等吗?
  • 您需要将 data[[i]] 更改为 data[[paste(j,i,k,sep=" ")]]。否则,data[[i]] 将不断被覆盖,直到最后的 j=5 和 k=6。
  • 能否在问题中包含segment_dat() 函数的内容?
  • 你看过split吗?还可以考虑添加定义为apply(segment_data[,c("Region", "gtv_class_bracket","hotelclass")],1,paste,sep="_") 的派生列(三列的串联)
  • @ChiPak yes , NORTH,GTV1,0.5 在特定列下。

标签: r


【解决方案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)

编辑

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

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2022-11-22
    • 2016-04-11
    相关资源
    最近更新 更多