2016-01-14 41 views
1

假设我有一个10x10矩阵。我怎样才能用0填充它,同时排除某些单独的单元格(最好在单个操作中)?R:将函数应用于矩阵,除了单个单元格

blank <- matrix(NA,nrow=10,ncol=10) 
for (i in 1:10) {for (j in 1:10) {blank[i,j] <- 0 }} 
# except blank[2,5], blank[9,3], blank[1,4], to be left NA 
+2

为了给你的marix填零,只需做blank [] < - 0'。关于“NA”,这里还是有一些规则,或者只有随机单元?如果没有后面的算法,你可能需要单独做每一个 –

+0

感谢更简单的方法,是的,它们是随机的 – dasf

回答

2

可能更有效,而声明矩阵作为0和分配NA s到少数例外细胞:

blank <- matrix(0, nrow = 10, ncol = 10) 
blank[2, 5] <- blank[9, 3] <- blank[1, 4] <- NA 

或者,更可编程:

coords <- list(c(2, 5), 
       c(9, 3), 
       c(1, 4)) 

blank[do.call("rbind", coords)] <- NA 

(关键是?"["的这一部分):

当通过[对数组进行索引时,单个参数i可以是一个具有许多列的矩阵,其尺寸为x;那么结果是一个矢量,其元素对应于i的每一行中的索引组。

+4

或者你可以使用'blank [cbind(c(2,9, 1),c(5,3,4))] < - NA' –

+0

@docendodiscimus这是更好的(更可编程),我会加入它。谢谢,我的索引技能缺乏。 – MichaelChirico

+1

'do.call(rbind,这个列表/ do.call/rbind操作肯定比看起来更笨拙。 –

1

如果这应该是NA到零矩阵的随机分配,那么这可能就足够了。

zero3NA <- matrix(0, 10, 10) 
zero3NA[ cbind(sample(nrow(zero3NA), 3), sample(ncol(zero3NA), 3)) ] <- NA 
相关问题