Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Сохранение вывода из вложенных циклов for в r

Автор вопроса: MiscОтветов: 1

Я чувствую, что должен был найти/понять ответ на этот вопрос после частых поисков и большого количества чтения форума, но это все еще меня очень сбивает с толку. У меня есть два вложенных цикла for в r, и мне нужно сохранить вывод в переменную, но я точно не знаю, что назначить и где. Код работает так, как я хочу, просто я не могу найти, как получить вывод в той или иной форме. На вход циклов подается список подматриц. Вывод может быть либо в том же формате, но включать изменения, которые произошли в цикле, либо более идеальный формат будет включать все строки и столбцы в одну матрицу. Я попытался выполнить cbind, а также создать переменные вне циклов, чтобы сохранить все позже (вы, вероятно, заметите мои попытки закомментировать их), но, как я уже сказал, я все еще немного запутался. Любая помощь будет принята с благодарностью!

loop.List <- list()
#results.frame <- data.matrix()

ctr <- 0 # creating a counter and zeroing it


for (i in 1:length(subM.List))   { #Looping through each submatrix in the list
  loop.List[[i]] <- list()
  for (j in 2:nrow(subM.List[[i]])){ #Loop through each row of each submatrix in the list
  if ((subM.List[[i]][j, "LAT"] == -180) & #Imputation 1, imputing data points with 0 activity intensity
     (subM.List[[i]][j, "ACTIVITYIN"] ==  0)   &
     !((subM.List[[i]][j-1, "ACTIVITYIN"]  >  0))[1]) {   #stop imputing at the first occurrence of a value > 0 in activity intensity
        imputeLat <- replace(subM.List[[i]][ ,"LAT"], subM.List[[i]][j,"LAT"], subM.List[[i]][j-1,"LAT"])
        imputeLon <- replace(subM.List[[i]][ ,"LON"], subM.List[[i]][j,"LON"], subM.List[[i]][j-1,"LON"])
        replace.col <- replace(subM.List[[i]][ ,"Impute"], subM.List[[i]][j,"Impute"], 1) #populated impute column. If point is imputed will have a 1
        allComb <- cbind(imputeLat, imputeLon, replace.col)
        ctr <- (ctr + 1)
    }
  }
  #result[[i]] <- allComb
#write.table(results.frame, "C:\\RWorkspace\\newMatrix.txt")
  #return(results.frame)
}

РЕДАКТИРОВАТЬ: образец данных одной из подматриц Список содержит несколько подматриц с разным количеством строк.

FixTYPE          ActivityIn    LAT     LON     Impute
 8                      0   32.81320 -117.2300
 8                      0   32.81324 -117.2301
 8                      1   32.81327 -117.2302
 8                      1   32.81326 -117.2301
 6                      0   32.81324 -117.2300
 6                      0   32.81338 -117.2302
 6                      0   32.81353 -117.2299
 7                      0   -180.000 -180.000
 7                      0   -180.000 -180.000
 7                      0   -180.000 -180.000
 7                      0   -180.000 -180.000
 7                      1   -180.000 -180.000
 7                      2   -180.000 -180.000
 7                      1   -180.000 -180.000
 1                      0   32.81315 -117.2300
 8                      0   32.81318 -117.2300
  • Вероятно, все это можно было бы сделать с помощью lapply и apply, но без доступа к вашим данным (или минимального примера) трудно помочь конкретно alexwhan 18.06.2013
  • Я бы рекомендовал вам написать функцию foo, которая принимает одну подматрицу в качестве входных данных и выводит allComb. Затем запустите lapply(subM.List, foo) или do.call(rbind, lapply(subM.List, foo)). flodel 18.06.2013

rnested-loopsoutputsubmatrix

Ответы

Ответ 1 · рейтинг 4 · David Marx

Подобно тому, как вы создаете переменную ctr за пределами вашего цикла for, если вы хотите сохранить результаты этих циклов, вы должны создать какую-то переменную хранения для вывода, который вы пытаетесь захватить. Если вы можете предоставить воспроизводимый пример, мы можем помочь вам больше.

Вот простой пример:

p=10
q=20
M=matrix(seq(1,p*q), p, q)

output=matrix(NA, p,q) # storage matrix
for(i in 1:p){
  for(j in 1:q){
    # do something
    output[i,j] = 2*i + j^2
  }
}

Как заявляли другие, вполне вероятно, что то, что вы пытаетесь выполнить, будет упрощено с помощью функций apply.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы