避免在R中嵌套循环

时间:2013-11-17 19:58:17

标签: r nested vectorization

我有这组序列,第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小时并且正在运行。需要一种更快的方法来解决这个问题。

任何帮助将不胜感激。

由于

1 个答案:

答案 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或类似的东西时进行转换,但因此,我们需要更多的上下文。