Как создать пустую матрицу в R?

Я новичок в R. Я хочу заполнить пустую матрицу результатами моего цикла for, используя cbind. Мой вопрос в том, как мне исключить НП из первого столбца моей матрицы. Я включаю свой код ниже:

output<-matrix(,15,) ##generate an empty matrix with 15 rows, the first column already filled with NAs, is there any way to leave the first column empty?

for(`enter code here`){
  normF<-`enter code here`
  output<-cbind(output,normF)
}

На выходе получилась матрица, которую я ожидал. Проблема только в том, что его первый столбец заполнен НП. Как я могу удалить эти НП?


person user3276582    schedule 05.02.2014    source источник
comment
В R это очень плохая идея. Растущие структуры делают код очень медленным.   -  person Fernando    schedule 05.02.2014


Ответы (4)


По умолчанию matrix имеет 1 столбец. Чтобы явно было 0 столбцов, вам нужно написать

matrix(, nrow = 15, ncol = 0)

Лучшим способом было бы предварительно выделить всю матрицу, а затем заполнить ее

mat <- matrix(, nrow = 15, ncol = n.columns)
for(column in 1:n.columns){
  mat[, column] <- vector
}
person Christopher Louden    schedule 05.02.2014
comment
Я обнаружил, что во втором методе, если размер вектора был неизвестен, третья строка была бы mat[1:length(vector), column] <- vector, чтобы разрешить заполнение NA для матрицы. - person BLiu1; 18.01.2020

Если вы заранее не знаете количество столбцов, добавьте каждый столбец в список и cbind в конце.

List <- list()
for(i in 1:n)
{
    normF <- #something
    List[[i]] <- normF
}
Matrix = do.call(cbind, List)
person Señor O    schedule 05.02.2014

Я был бы осторожен, отвергнув что-то как плохую идею, потому что это медленно. Если это часть кода, выполнение которой не требует много времени, то медлительность не имеет значения. Я просто использовал следующий код:

for (ic in 1:(dim(centroid)[2]))
{
cluster[[ic]]=matrix(,nrow=2,ncol=0)
}
# code to identify cluster=pindex[ip] to which to add the point
if(pdist[ip]>-1)
{
cluster[[pindex[ip]]]=cbind(cluster[[pindex[ip]]],points[,ip])
}

для проблемы, которая возникла менее чем за 1 секунду.

person Jonathan Harris    schedule 05.11.2014

Чтобы избавиться от первого столбца NA, вы можете сделать это с отрицательной индексацией (которая удаляет индексы из набора данных R). Например:

output = matrix(1:6, 2, 3) # gives you a 2 x 3 matrix filled with the numbers 1 to 6

# output = 
#           [,1] [,2] [,3]
#     [1,]    1    3    5
#     [2,]    2    4    6

output = output[,-1] # this removes column 1 for all rows

# output = 
#           [,1] [,2]
#     [1,]    3    5
#     [2,]    4    6

Таким образом, вы можете просто добавить output = output[,-1] после цикла for в исходный код.

person Sheldon    schedule 21.09.2018
comment
Или, как в ответе Кристофера, вы можете начать с матрицы, в которой нет столбцов, как output = matrix(,15,0) - person Sheldon; 21.09.2018