我有原始数据集(1100000 * 62),我需要根据手动过滤器划分数据。
我创建了一个可以通过手动输入参数来分离数据的功能:它采用以下参数。
segment_dat <- function(data, Region, gtv_class_bracket, hotelclass){...}
要求:数据子集应在以下参数上:
...
我对迭代循环有点新意。 我找到了多个线程,我能够编写下面的代码,但它现在没有用。最终目的是将每个数据集提供给另一个编写的函数进行聚类分析。如果您有任何线索,请提供帮助。基本上我需要迭代三个列表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 :(得分: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)
替换了代码中不存在的变量;现在都应该工作了。