我有这组序列,第3个变量(设备)有2个变量。现在我想将每个设备的序列分成300组。dsl
是一个数据帧,其中d
是设备ID,s
是长度为300的序列数。
首先,我标记(列Sid
)所有序列rep(1,300)
后跟rep(2,300)
,依此类推至rep(s,300)
。无论未标记的是什么,即初始化标签(= 0)都需要被忽略。实际的标签虽然是seqid
向量。
我必须这样做,因为我想堆叠300个数据点的集合然后转置它。这将构成我的predata data.frame的一行。对于每个predata数据帧,我正在做k-means来生成我存储在最终数据中的5个簇。
基本上对于每个设备,我将有5个集群,然后我可以通过引用最终数据中的行号(映射到设备ID)来拉取。
#subset processed data by device
for (ds in 1:387){
d <- dsl[ds,1]
s <- dsl[ds,3]
temp.data <- subset(data,data$Device==d)
temp.data$Sid <- 0
temp.data[1:(s*300),4] <- rep(1:300,s)
temp.data <- subset(temp.data,temp.data$Sid!="0")
seqid <- NA
for (j in 1:s){ seqid[(300*(j-1)+1):(300*j)] <- j }
temp.data$Sid <- seqid
predata <- as.data.frame(matrix(numeric(0),s,600))
for(k in 1:s){
temp.data2 <- subset(temp.data[,c(1,2)], temp.data$Sid==k)
predata[k,] <- t(stack(temp.data2)[,1])
}
ob <- kmeans(predata,5,iter.max=10,algorithm="Hartigan-Wong")
finaldata <- rbind(finaldata,(unique(fitted(ob,method="centers"))))
}
作为R的菜鸟,我最终得到了3个嵌套循环(该函数最适用于最外面的循环是一个值)。这需要5小时并且正在运行。需要一种更快的方法来解决这个问题。
任何帮助将不胜感激。
由于
答案 0 :(得分:0)
好的,我建议在循环中对代码进行彻底的简化。但是,如果没有样本数据,很难确定我确实做了正确的事情。因此,请确保我的predata
实际上与您的相同。
首先是代码:
for (ds in 1:387){
d <- dsl[ds,1]
s <- dsl[ds,3]
temp.data <- subset(data,data$Device==d)
temp.data <- temp.data[1:(s*300),]
predata <- cbind(matrix(temp.data[,1], byrow=T, ncol=300), matrix(temp.data[,2], byrow=T, ncol=300))
ob <- kmeans(predata,5,iter.max=10,algorithm="Hartigan-Wong")
finaldata <- rbind(finaldata,(unique(fitted(ob,method="centers"))))
}
我理解你在做什么:从300*s
获取第一个subset(data, data$Devide == d
元素。这可以使用命令
temp.data <- temp.data[1:(s*300),]
然后,您收集具有第一行c(temp.data[1:300, 1], temp.data[1:300, 2])
的矩阵,依此类推所有其他行。我使用上面的matrix
命令执行此操作。
我假设您的外部循环可以在调用tapply
或类似的东西时进行转换,但因此,我们需要更多的上下文。