R中的循环:如何保存输出?

时间:2012-03-13 17:53:45

标签: r for-loop matrix logical-operators

我正在尝试从逻辑测试循环中保存数据。

所以我有以下数据:

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])中每一个的比较

我需要在这些矩阵中包含值,以便进一步用作网络图的邻接矩阵。但是,当我既不能将这些逻辑值分配给矩阵时,也不能使用“write.matrix”将它们保存在csv值中。

所以,我需要用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 个答案:

答案 0 :(得分:9)

将每个布尔矩阵存储为列表中的项目:

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]]

答案 1 :(得分:6)

另一种做joran建议的方法是使用apply系列函数。

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

这与joran的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 ...