2010-12-05 6 views
4

Я задавался вопрос о том, каковы способы построения массива динамического размера в R.Построить динамического размер массива в R

Для одного примера, я хочу построить п-вектор, а его размерность п определяется динамически , Следующий код будет работать:

> x=NULL 
> n=2; 
> for (i in 1:n) x[i]=i; 
> x 
[1] 1 2 

В качестве другого примера, я хочу построить п на 2 матрицы, где число строк п динамически определяется. Но я не могу даже присвоить первый ряд:

> 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,:" 

Спасибо и приветствую!

ответ

4

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

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

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

arr <- array(1) 

arr <- append(arr,3) 

arr[1] <- 2 

print(arr[1]) 

(найдено на rosettacode.org)

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

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

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 
Смежные вопросы