我想创建几个矩阵,并将通过函数获得的值自动分配给特定的行。我将举例说明我到目前为止所尝试的内容:
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(和编程)的新手,所以有可能我选择了最糟糕的方法来解决这个问题,而且列表或数组会更容易使用。感谢您的回复。
答案 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,]