1

我正在尝试使用此代码用行向量 (1,0) 填充 (500,2) 矩阵的一些行,最后一行是验证结果:

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?

4

3 回答 3

3

您正在尝试填充矩阵的一部分,因此您尝试放入的块应该具有正确的大小:

 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,]
于 2018-10-15T06:41:25.963 回答
2

仅按列执行此操作会更干净:

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

您也可以使用矩阵索引在一行中完成此操作,如下所示:

data[cbind(rep(41:150, each = 2L), 1:2)] = 1:0
于 2018-10-15T06:46:28.707 回答
1

你可以使用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 方法是最干净/最节省使用的方法。

于 2018-10-15T08:07:24.597 回答