Построить массив динамического размера в R - PullRequest
5 голосов
/ 05 декабря 2010

Мне было интересно, как можно построить массив динамического размера в 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,:"  

Спасибо и всего наилучшего!

Ответы [ 6 ]

6 голосов
/ 05 декабря 2010

Я думаю, что вы ищете ответы 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

Но я думаю, что использование разреженных матриц лучше всего резервировать для последующего использования послеосвоение регулярных матриц.

4 голосов
/ 05 декабря 2010

Можно измерить массив после того, как мы заполним его (в одномерном, векторном, модном)
Эмулируя одномерный фрагмент вопроса, вот как это может бытьсделано с более высокими размерами.

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

Мы также можем получить аналогичный результат, переназначив x с помощью cbind / rbind, следующим образом.

> 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 голосов
/ 05 декабря 2010

Я считаю, что вам нужен такой подход

arr <- array(1)

arr <- append(arr,3)

arr[1] <- 2

print(arr[1])

(находится на rosettacode.org)

2 голосов
/ 05 декабря 2010

Вы можете привязать его:

tmp = c(1,2) 

x = NULL

rbind(x, tmp)
1 голос
/ 05 декабря 2010

Когда я хочу динамически построить массив (матрицу), я делаю это так:

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" 
0 голосов
/ 14 декабря 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...