2012-04-24 2 views
1

차원 n의 벡터가 있고 0과 1로 구성된다고 가정합니다. 그런 다음이 벡터를 m 개의 동일한 빈으로 나눕니다. bin은 적어도 하나의 "1"을 포함하는 경우 active라고합니다. 활성 저장소의 위치와 그 안에 들어있는 "1"의 수를 반환하는 명령을 작성하고 싶습니다.벡터 조작 R

예를 들어, I는이 벡터를 가지고 : N = 15, m = 5

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

I는 (그들이 포함 얼마나 1) 행렬 [1 2 4 5] (활성 빈들) 및 [1 2 1 3]를 원한다.

for 루프를 사용하지 않고 R로 쓸 수 있습니까?

+0

아마도. (그냥 btw, 숙제입니까?) – huon

답변

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)); which (no> 0); no [no> 0]' –

+4

또는'no <- colSums (matrix (a, 3))'입니다. 짧은 코드, FTW! ;-) –

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이처럼 않습니다.