我目前有以下代码。
names <- c("Red","Green","Blue","Orange","Yellow")
aMatrix <- matrix(data=0,nrow=5,ncol=5)
df <- data.frame(matrix(nrow=5,ncol=2))
colnames(df)=c("Number","name")
selectedRows=sample(1:5, 5)
samples=sample(1:5, 5)
for (i in 1:5){
df[i,"Number"]=i
df[i,"name"]=names[samples[i]]
}
for (i in 1:5){
aMatrix[i,which(names==df[selectedRows[i],"name"])]=1
}
有没有一种方法可以对最后一个循环进行矢量化处理,从而使其运行得更快?
答案 0 :(得分:2)
这可以通过以下方法完成:使用match
创建一个列索引,使用该列索引创建一个cbind
行索引,从aMatrix
中提取值并将其分配给1
aMatrix2 <- aMatrix # before the assignment in OP's code
aMatrix2[cbind(seq_len(nrow(aMatrix)), match(df$name[selectedRows], names))] <- 1
-检查
identical(aMatrix, aMatrix2)
#[1] TRUE