我正在尝试使用此代码用行向量(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中没有行索引?
答案 0 :(得分: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,]
答案 1 :(得分:2)
按列进行此操作会更清洁:
data[41:150, 1L] = 1
data[41:150, 2L] = 0
您也可以像这样用矩阵索引在一行中完成此操作:
data[cbind(rep(41:150, each = 2L), 1:2)] = 1:0
答案 2 :(得分: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方法是最干净/最节省使用的方法。