Петля в R: как сохранить выходы? - PullRequest
7 голосов
/ 13 марта 2012

Я пытаюсь сохранить данные из цикла логических тестов.

Итак, у меня есть следующие данные:

T1 <- matrix(seq(from=100000, to=6600000,length.out=676),26,26) # a matrix of 26X26 - here with illustrive values

minmax <- seq(from=1,to=49,by=1) # creates a sequence
Fstep <- 6569141.82/minmax       # define a vector from 0 to 6569141.82 with 49 divisions
F <- rev(round(Fstep,0))         # round the vector values and re order them
F

Я запустил следующий цикл

for (i in 1:49) {
  print(T1 > F[i]) # I used print to see the results in the screen
}

Этот цикл возвращает мне 49 матриц, заполненных логическими значениями (True или false).Каждая матрица представляет собой сравнение T1 с каждой из 49 позиций F [i] (F [1], ...., F [49])

Мне нужно иметь значения в этих матрицах для дальнейшегоиспользование в качестве матриц смежности для сетевых графиков.Однако, когда я не могу ни присвоить эти логические значения матрице, ни сохранить их в значениях CSV, используя «write.matrix».

Итак, мне нужно, чтобы 49 - матрицы "W" были заполнены логическими значениями (T или F).Я уже получил эти значения в цикле выше, но я не могу получить его как объект или как коллекцию CSV.файлы.

Я попытался

W<-matrix(0,26,26) #create an empty matrix to assign the logical arguments
for (i in 1:49){
  W[i] <- T1>F[i] # I used print to see the results in the screen
}

, который возвращает следующее предупреждение

Warning messages:
1: In W[i] <- (T1 > F[i]) :
  number of items to replace is not a multiple of replacement length

Я также попробовал другой параметр, в котором все сравниваемые матрицы имеют одинаковые размеры,

create.M <- function(F){ #  a function to transform  each position F[i] into a 26X26 matrix
  for (i in 1:49) {
    matrix(F[i],26,26)
  }
}

Loop.T1 <- function(T1){ #  a function to replicate T1(49 times)
  for ( i in 1:49) {
    T1
  }
}

и сравнил два выхода

Loop.T1(T1)>create.M(F)

, который возвращает

logical(0)

Ответы [ 2 ]

9 голосов
/ 13 марта 2012

Хранить каждую логическую матрицу как элемент списка:

result <- vector("list",49)
for (i in 1:49)
{
   result[[i]] <- T1>F[i] # I used print to see the results in the screen
}

#Print the first matrix on screen
result[[1]]
6 голосов
/ 13 марта 2012

Еще один способ сделать то, что предлагает Джоран, - это использовать семейство функций apply.

result2 <- lapply(F, function(f) {T1 > f})

Это дает то же самое, что и result Джорана, список, где каждый элемент соответствует одному из значений F, и этот элемент представляет собой логическую матрицу 26x26.

Другой альтернативой является сохранение результатов в виде трехмерной логической матрицы (49 * 26 * 26), где каждый срез соответствует одному из значений F.

result3 <- sapply(F, function(f) {T1 > f}, simplify="array")

структура которого

> str(result3)
 logi [1:26, 1:26, 1:49] FALSE FALSE FALSE FALSE TRUE TRUE ...
...