[英]Avoiding nested loops in R
我有这组序列,其中第三个变量(设备)有2个变量。 现在,我想将每个设备的序列分成300组dsl
是一个数据帧,其中包含d
是设备id,而s
是长度为300的序列数。
首先,我标记(列Sid
)所有序列rep(1,300)
然后标记rep(2,300)
,依此类推,直到rep(s,300)
为止。 任何未标记的东西,即带有初始化标签(= 0)的东西都需要忽略。 实际的标记通过seqid
向量进行。
我必须这样做,因为我要堆叠300个数据点的集合然后进行转置。 这将构成我的predata data.frame的一行。 对于每个预数据数据帧,我正在执行k均值以生成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小时并开始运行。 需要一个更快的方法来解决这个问题。
任何帮助将不胜感激。
谢谢
好的,我将建议在循环中彻底简化您的代码。 但是,很难验证我是否确实没有样本数据就做出了正确的假设。 因此,请确保我的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"))))
}
我了解您正在执行的操作:从您的subset(data, data$Devide == d
获取前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])
的矩阵c(temp.data[1:300, 1], temp.data[1:300, 2])
。 我使用上面的matrix
命令执行此操作。
我假设您的外部循环可以在对tapply
或类似调用中进行转换,但是因此,我们需要更多上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.