我想按行(和工作表)将数据添加到数组中。但是,我在下面尝试过的方法都不起作用。我确信有一个非常简单的答案,但它逃脱了我,我无法通过搜索互联网找到答案。谢谢你的任何建议。
I <- 4 # rows
J <- 2 # columns
K <- 3 # sheets
my.data <- array( 0 , c(I,J,K))
sheet1 <- c(2,5)
sheet2 <- c(7,1)
sheet3 <- c(4,4)
# desired result
#
# , , 1
#
# [,1] [,2]
# [1,] 2 5
# [2,] 2 5
# [3,] 2 5
# [4,] 2 5
#
# , , 2
#
# [,1] [,2]
# [1,] 7 1
# [2,] 7 1
# [3,] 7 1
# [4,] 7 1
#
# , , 3
#
# [,1] [,2]
# [1,] 4 4
# [2,] 4 4
# [3,] 4 4
# [4,] 4 4
这些都不起作用:
my.data <- array( 0 , c(I,J,K)) ; my.data[1:I, , 1] <- sheet1 ; my.data
my.data <- array( 0 , c(I,J,K)) ; my.data[, 1:J, 1] <- sheet1 ; my.data
my.data <- array( 0 , c(I,J,K)) ; aperm(my.data[1:I,,1], perm=sheet1) ; my.data
答案 0 :(得分:1)
如果您未通过替换创建my.data
,则可以尝试:
sheets <- list(sheet1, sheet2, sheet3)
vapply(sheets, rep, matrix(numeric(), ncol=J, nrow=I), each=I)
否则:
my.data <- array( 0 , c(J,I,K))
my.data[, , 1] <- sheet1
my.data[, , 2] <- sheet2
my.data[, , 3] <- sheet3
aperm(my.data, c(2, 1, 3))
请注意我是如何切换J
和I
的。您需要这样做,因为矢量回收是在列基础上完成的(即填充一列,然后再循环)。通过创建转换尺寸为1和2的数组,您可以允许您的值对优雅地循环(即第一个值到第一行,第二个到第二个)。
完成后,您可以使用aperm
置换第1和第2个dims,就像您尝试过的那样。
答案 1 :(得分:1)
您希望每个值重复4次,因此请使用rep()
和[<-
my.data[ , , 1:3] <- rep( c(sheet1,sheet2, sheet3), each=4)
> my.data
, , 1
[,1] [,2]
[1,] 2 5
[2,] 2 5
[3,] 2 5
[4,] 2 5
, , 2
[,1] [,2]
[1,] 7 1
[2,] 7 1
[3,] 7 1
[4,] 7 1
, , 3
[,1] [,2]
[1,] 4 4
[2,] 4 4
[3,] 4 4
[4,] 4 4
循环?我们不需要没有steenking循环!
答案 2 :(得分:0)
这是一种可能的方法,但它使用嵌套的for-loops
:
I <- 4 # rows
J <- 2 # columns
K <- 3 # sheets
my.data <- array( 0 , c(I,J,K))
sheet1 <- c(2,5)
sheet2 <- c(7,1)
sheet3 <- c(4,4)
for(i in 1:I) {
for(j in 1:J) {
for(k in 1:K) {
if (k == 1) (my.data[i,j,k] = sheet1[j])
if (k == 2) (my.data[i,j,k] = sheet2[j])
if (k == 3) (my.data[i,j,k] = sheet3[j])
}
}
}
my.data
, , 1
[,1] [,2]
[1,] 2 5
[2,] 2 5
[3,] 2 5
[4,] 2 5
, , 2
[,1] [,2]
[1,] 7 1
[2,] 7 1
[3,] 7 1
[4,] 7 1
, , 3
[,1] [,2]
[1,] 4 4
[2,] 4 4
[3,] 4 4
[4,] 4 4