我想知道在R中构建动态大小数组的方法是什么。
举一个例子,我想构造一个n向量,但它的维数n是动态确定的。以下代码将起作用:
> x=NULL
> n=2;
> for (i in 1:n) x[i]=i;
> x
[1] 1 2
另一个例子,我想构造一个n乘2的矩阵,其中行数n是动态确定的。但即使在分配第一行时我也失败了:
> tmp=c(1,2)
> x=NULL
> x[1,]=tmp
Error in x[1, ] = tmp : incorrect number of subscripts on matrix
> x[1,:]=tmp
Error: unexpected ':' in "x[1,:"
谢谢和问候!
答案 0 :(得分:6)
我认为你要找的答案是rbind()和cbind():
> x=NULL # could also use x <- c()
> rbind(x, c(1,2))
[,1] [,2]
[1,] 1 2
> x <- rbind(x, c(1,2))
> x <- rbind(x, c(1,2)) # now extend row-wise
> x
[,1] [,2]
[1,] 1 2
[2,] 1 2
> x <- cbind(x, c(1,2)) # or column-wise
> x
[,1] [,2] [,3]
[1,] 1 2 1
[2,] 1 2 2
尝试在尝试时动态分配“新索引”的策略可以在某些语言中完成,但不能在R中以这种方式完成。
您还可以使用Matrix包中提供的稀疏矩阵。他们将允许分配M <- sparseMatrix(i=200, j=50, x=234)
形式,在第200行,第50行和第0行产生单个值。
require(Matrix)
M <- sparseMatrix(i=200, j=50, x=234)
M[1,1]
# [1] 0
M[200, 50]
# [1] 234
但我认为稀疏矩阵的使用最好保留在掌握常规矩阵后供以后使用。
答案 1 :(得分:4)
在填充之后可以对数组进行尺寸标注(以一维,矢量,方式) 模拟问题的一维片段,这是更高维度的方式。
> x=c()
> tmp=c(1,2)
> n=6
> for (i in seq(1, by=2, length=n)) x[i:(i+1)] =tmp;
> dim(x) = c(2,n)
> x
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 1 1 1
[2,] 2 2 2 2 2 2
>
不是使用i:(i+1)
作为索引,最好使用seq(i, length=2)
或更好,seq(i, length=length(tmp))
用于更通用的方法,如下所示(对于4 x 7数组)例如)
> x=c()
> tmp=c(1,2,3,4)
> n=7
> for (i in seq(1, by=length(tmp), length=n))
x[seq(i, length=length(tmp))] = tmp;
> dim(x) = c(length(tmp),n)
> x
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 1 1 1 1 1 1
[2,] 2 2 2 2 2 2 2
[3,] 3 3 3 3 3 3 3
[4,] 4 4 4 4 4 4 4
>
我们也可以通过使用cbind / rbind重新分配x来获得类似的结果,如下所示。
> tmp=c(1,2)
> n=6
> x=rbind(tmp)
> for (i in 1:n) x=rbind(x, tmp);
> x
[,1] [,2]
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
注意:人们可以摆脱“tmp”名称(这是rbind的副作用),具有
> dimnames(x)=NULL
答案 2 :(得分:2)
你可以反驳它:
tmp = c(1,2)
x = NULL
rbind(x, tmp)
答案 3 :(得分:2)
我相信这是您需要的方法
arr <- array(1)
arr <- append(arr,3)
arr[1] <- 2
print(arr[1])
(在rosettacode.org上找到)
答案 4 :(得分:1)
当我想动态构造一个数组(矩阵)时,我这样做:
n <- 500
new.mtrx <- matrix(ncol = 2, nrow = n)
head(new.mtrx)
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] NA NA
[4,] NA NA
[5,] NA NA
[6,] NA NA
您的矩阵现在已准备好接受矢量。
假设您已有一个向量,则将其传递给matrix()
函数。注意如何将值“分解”到矩阵中(按列方式)。这可以使用byrow
参数进行更改。
matrix(letters, ncol = 2)
[,1] [,2]
[1,] "a" "n"
[2,] "b" "o"
[3,] "c" "p"
[4,] "d" "q"
[5,] "e" "r"
[6,] "f" "s"
[7,] "g" "t"
[8,] "h" "u"
[9,] "i" "v"
[10,] "j" "w"
[11,] "k" "x"
[12,] "l" "y"
[13,] "m" "z"
答案 5 :(得分:0)
n = 5
x = c(1,2) %o% rep(1,n)
x
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 1 1 1 1
# [2,] 2 2 2 2 2
x = rep(1,n) %o% c(1,2)
x
# [,1] [,2]
# [1,] 1 2
# [2,] 1 2
# [3,] 1 2
# [4,] 1 2
# [5,] 1 2