2012-04-24 127 views
1

假设我有一个维度为n的矢量,它由0和1组成。然后我把这个矢量分成m个相等的bin。如果一个箱包含至少一个“1”,则该箱被称为活动箱。我想写一个命令返回活动垃圾箱的位置以及它们包含多少“1”。R中的矢量操作

例如,我有这样的矢量为:N = 15,M = 5

[1 0 0 | 0 1 1 | 0 0 0 | 0 1 0| 1 1 1] 

我想有矩阵[1 2 4 5](活性仓)和[1 2 1 3](它们多少含有1)。

我可以在不使用for循环的情况下在R中编写它吗?

+0

也许吧。 (只是顺便说一句,这是作业吗?) – huon 2012-04-24 16:33:42

回答

4

我会做这样的:

a <- c(1,0,0,0,1,1,0,0,0,0,1,0,1,1,1) 
m <- 5 
idx <- rep(1:m, each=length(a)/m) 

# how many ones? 
no <- sapply(1:5, function(x) sum(a[idx==x])) 

# which bins contain ones? 
bins <- 1:m 
bins[no>0] 
+4

或'no < - rowSums(matrix(a,ncol = 3,byrow = TRUE));其中(无> 0); no [no> 0]' – 2012-04-24 16:50:37

+4

或'no < - colSums(matrix(a,3))'。较短的代码,FTW! ;-) – 2012-04-24 16:59:18

1

另一种方法用的人的数量来获得向量:

x <- c(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1) 

n <- length(x) 
m <- 5 
size <- n/m 

x.list <- split(x, cut(seq_along(x)/size, 0:m)) 

vapply(x.list, sum, 0) 

从那里,做的jigr一样。