【发布时间】:2017-08-29 03:59:28
【问题描述】:
我有大小为(1100000*62)的原始数据集,我需要根据手动过滤器划分数据。
我创建了一个可以通过手动输入参数来分离数据的函数:它需要以下参数。
segment_dat <- function(data, Region, gtv_class_bracket, hotelclass){...}
要求:数据子集应在以下参数上:
- data[[1]] 应该基于 NORTH-GTV1-0.5
- data[[2]] 应该基于 NORTH-GTV1-5
...
- 数据[[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