繁体   English   中英

避免R中的嵌套循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM