当矩阵名称是字符串时,如何将值分配给矩阵的行

时间:2013-04-16 19:38:58

标签: r

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

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)之后,我将所有的EXAMPLE矩阵展开以填充1行(并且在第二行 - 第二行填充之后,以便当循环结束时,我将具有充满数字的EXAMPLE矩阵。 )。

     [,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)来生成矩阵的名称,而我用来表示使用哪个观察函数以及在哪个行中放置结果。矩阵已经创建,但我发现无法将结果传递给矩阵的行。

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

3 个答案:

答案 0 :(得分: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']]

答案 1 :(得分:0)

看起来你正试图迭代你的不同基质, 然后迭代给定矩阵中的每一行。

如果任务是迭代,你应该考虑使用列表 - 或者如果迭代matricies,数组

# 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

答案 2 :(得分: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,]