Заполнение матрицы в R - PullRequest
       2

Заполнение матрицы в R

0 голосов
/ 15 октября 2018

Я пытаюсь заполнить некоторые строки матрицы (500,2) вектором строк (1,0), используя этот код, последняя строка должна проверить результат:

data<-matrix(ncol=2,nrow=500)
data[41:150,]<-matrix(c(1,0),nrow=1,ncol=2,byrow=TRUE)
data[41:45,]

Норезультат

> data[41:45,]
     [,1] [,2]
[1,]    1    1
[2,]    0    0
[3,]    1    1
[4,]    0    0
[5,]    1    1

вместо

> data[41:45,]
     [,1] [,2]
[1,]    1    0
[2,]    1    0
[3,]    1    0
[4,]    1    0
[5,]    1    0

(1) Что я делаю не так?

(2) Почему индексы строк не являются результатом 41, 42, 43, 44 и 45?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Будет проще сделать это по столбцам:

data[41:150, 1L] = 1
data[41:150, 2L] = 0

Вы также можете выполнить это в одной строке с матричной индексацией, например:

data[cbind(rep(41:150, each = 2L), 1:2)] = 1:0
0 голосов
/ 15 октября 2018

Вы можете использовать rep.

data[41:150,] <- rep(1:0, each=150-41+1)

#> data[41:45,]
#     [,1] [,2]
#[1,]    1    0
#[2,]    1    0
#[3,]    1    0
#[4,]    1    0
#[5,]    1    0

Я думаю, что подход MichaelChirico является самым чистым / экономичным для использования.

0 голосов
/ 15 октября 2018

Вы пытаетесь заполнить часть матрицы, поэтому блок, который вы пытаетесь вставить туда, должен иметь правильный размер:

 data[41:150,]<-matrix(c(1,0),nrow=110,ncol=2,byrow=TRUE)
 # nrow = 110, instead of 1 !!!!

В противном случае ваш кусочек будетдобавленный будет возвращен к вектору и добавлен по столбцам.Попробуйте, например, это:

 data[41:150,] <- matrix(c(1,2,3,4,5), nrow=5, ncol=2, byrow=TRUE)
 data[41:45,]
     [,1] [,2]
[1,]    1    1
[2,]    3    3
[3,]    5    5
[4,]    2    2
[5,]    4    4

Можно ли пожаловаться?Да и сейчас.Нет, потому что R ведет себя как задокументировано (матрицы - это векторы с атрибутами измерений, и переработка работает с векторами).Да, потому что, хотя переработка может быть удобной, она может создавать ложные ожидания.

Почему индексы строк не являются 41,42,43, ...?Я не знаю, вот как ведут себя матрицы и векторы.

> (1:10)[5:6]
[1] 5 6

(обратите внимание, что на выходе [1], а не [5].)

Фреймы данных ведут себя по-разному, так что вы увидите исходные номера строк для срезов:

 as.data.frame(data)[45:50,]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...