5

我想创建几个矩阵并将通过函数获得的值自动分配给特定的行。我将举例说明我到目前为止所做的尝试:

EXAMPLE1<-matrix(ncol=4, nrow=16)
EXAMPLE2<-matrix(ncol=4, nrow=16)
EXAMPLE3<-matrix(ncol=4, nrow=16)
EXAMPLE4<-matrix(ncol=4, nrow=16)


for(i in 1:16){
  for(j in 1:4){
    paste0("EXAMPLE",j, "[",i,",","]")<- c(1:4)
  }
}

for(i in 1:16){
  for(j in 1:4){
    get(paste0("EXAMPLE",j)[i,]<- c(1:4)
  }
}

但返回“赋值目标扩展为非语言对象”。所以我尝试了

for(i in 1:16){
  for(j in 1:4){
    assign(paste0("EXAMPLE",j, "[",i,",","]"), c(1:4))
  }
}

这不会返回错误,但值不会写入矩阵。

起初矩阵是空的

     [,1] [,2] [,3] [,4]
[1,]   NA   NA   NA   NA
[2,]   NA   NA   NA   NA
[3,]   NA   NA   NA   NA
[4,]   NA   NA   NA   NA

并且在执行一个循环之后(i = 1)我将所有示例矩阵都填充为1行(并且在第二-第二行填充之后,这样当循环结束时,我将拥有一个充满数字的示例矩阵。)。

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   NA   NA   NA   NA
[3,]   NA   NA   NA   NA
[4,]   NA   NA   NA   NA

关键是,我不知道如何为矩阵行赋值,因为我通过粘贴函数传递矩阵名称。如果我想将其名称作为字符串,如何将值分配给矩阵中的特定行?任何帮助都会很棒。谢谢

...版...对不起,我不是很清楚。正如我所提到的,我想将函数的结果(恰好与我的矩阵具有相同的列数)写入矩阵行。每行都会从应用于不同观察的函数中获取结果。我想将几个函数应用于同一个变量,所以我有几个矩阵用于不同函数的结果(列号不同,名称不同)。我对矩阵进行编号和命名的方式是最容易跟踪结果并在以后进行比较的方式。上面我只给出了一个问题示例,即我不能为一行矩阵赋值,因为我将矩阵的名称作为字符串给出(我这样做是因为否则会有很多编号要做)。所以总的来说我希望能够做到

EXAMPLEj[i,]<-SomeFunctionResult

j 在哪里 1 到 10 或其他一些数字

这就是为什么我使用循环并paste0("EXAMPLE", j)生成矩阵名称和 i 来表示要使用哪个观察函数以及将结果放在哪一行。矩阵已经创建,但我发现无法将结果传递给矩阵的行。

我是 R(和编程)的新手,所以我可能选择了最糟糕的方法来解决这个问题,并且列表或数组会更容易使用。谢谢你的回复。

4

3 回答 3

2

将各个矩阵放入列表中:

EXAMPLE <- list(EXAMPLE1, EXAMPLE2, EXAMPLE3, EXAMPLE4)

然后,只需按索引访问此列表中的矩阵:

for(i in 1:16){
  for(j in 1:4){
    EXAMPLE[[j]][i,] <- c(1:4)
  }
}

该列表也可以命名,并通过以下名称访问:

EXAMPLE <- list(EXAMPLE1=EXAMPLE1, EXAMPLE2=EXAMPLE2,
                EXAMPLE3=EXAMPLE3, EXAMPLE4=EXAMPLE4)
EXAMPLE[['EXAMPLE1']]
于 2013-04-16T19:59:37.193 回答
0

看起来您正在尝试迭代不同的矩阵,然后迭代给定矩阵中的每一行。

如果任务是迭代,你应该考虑使用列表——或者如果迭代矩阵、数组

# create an array of 5 (five) 16x4 matricies: 
EXAMPLE <- array(dim=c(16, 4, 5))  # i changed your four examples to 5, to be clear

# Have a look at the 5 matricies: 
EXAMPLE

# TO SELECT A SINGLE MATRIX, SAY EXAMPLE2: 
EXAMPLE[,, 2]  # note the two commas

那么如果你想用循环来迭代(一般不推荐,但很简单)

for (k in 1:5)  # again, using 5 to distinguish
  for (i in 1:16)
    EXAMPLE[i, , k] <- i* (1:4)

EXAMPLE

您也可以使用apply,其中MARGIN参数对应于您设置的尺寸。(即,在这种情况下,MARGIN==1用于行、2列和3特定矩阵)

例如, apply(EXAMPLE, MARGIN=3, FUN=someFunction) 将函数someFunction应用于每个矩阵,一次一个。换句话说,它遍历每个矩阵,很像上面的k-for循环

因此,上面的两个嵌套循环可以放在一行代码中:

# note the empty [ ] to maintain array properties
EXAMPLE[ ] <- apply(EXAMPLE, 3, function(M) 1:ncol(M) %x% 1:nrow(M))

# have a look at the results
EXAMPLE
于 2013-04-16T20:17:23.087 回答
0

是否试图显示两个矩阵之间的差异?

> EXAMPLE2 <- matrix(ncol=4, nrow=16, sample(1:10, 4*16, replace=TRUE))

> EXAMPLE1 <- EXAMPLE2
> EXAMPLE1[3,4] <- 99

> diffs <- ifelse(EXAMPLE1!=EXAMPLE2, EXAMPLE1, "")
> diffs
      [,1] [,2] [,3] [,4]
 [1,] ""   ""   ""   ""  
 [2,] ""   ""   ""   ""  
 [3,] ""   ""   ""   "99"
 [4,] ""   ""   ""   ""  
 [5,] ""   ""   ""   ""  
 [6,] ""   ""   ""   ""  
 [7,] ""   ""   ""   ""  
 [8,] ""   ""   ""   ""  
 [9,] ""   ""   ""   ""  
[10,] ""   ""   ""   ""  
[11,] ""   ""   ""   ""  
[12,] ""   ""   ""   ""  
[13,] ""   ""   ""   ""  
[14,] ""   ""   ""   ""  
[15,] ""   ""   ""   ""  
[16,] ""   ""   ""   ""  

> print(diffs, quote=FALSE)
      [,1] [,2] [,3] [,4]
 [1,]                    
 [2,]                    
 [3,]                99  
 [4,]                    
 [5,]                    
 [6,]                    
 [7,]                    
 [8,]                    
 [9,]                    
[10,]                    
[11,]                    
[12,]                    
[13,]                    
[14,]                    
[15,]                    
[16,]                    
于 2014-10-25T08:44:14.187 回答