【问题标题】:How to assign values to row of a matrix when matrix name is a character string当矩阵名称是字符串时如何为矩阵的行赋值
【发布时间】:2013-04-16 19:38:58
【问题描述】:

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

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(和编程)的新手,所以我可能选择了最糟糕的方法来解决这个问题,并且列表或数组会更容易使用。感谢您的回复。

【问题讨论】:

  • 你能给出你想要的结果吗?
  • 您是否尝试在列上创建一个带有1,2,3,4 的矩阵并为所有行重复它?
  • 不清楚你想做什么!试着展示你想用一个矩阵做什么。那么我认为最好将你的变量放在一个列表中,并使用do.calllapply 来概括你对单个矩阵所做的事情。

标签: r


【解决方案1】:

将各个矩阵放入列表中:

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

【讨论】:

    【解决方案2】:

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

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

    # 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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多