2014-07-11 1 views
4

에 TRUEs의 블록을 식별 및 R.를 사용하여 내가 TRUEs의 블록의 값을 합산하고, 매트릭스 또는 STH에 넣어 싶습니다나는 문제가 발생하여 좀 분석 물건을하고 있어요 목록

num = (1, 4, 3, 7, 3, 2 , 23, 98, 5) 

: 논리 값 A는 숫자 값의 목록을 가지고있다. 다만 그런

:

list[1] == TRUE and list[2] == TRUE and list[3] == TRUE

그래서는 합계 산출있어 1 + 4 + 3 = 8 그래서 matrix[1,1] <- 8을하고리스트 [4]와리스트를 생략 [5]가 FALSE이고 목록으로 이동하기 때문에 [6], matrix[2,1] <- 2 ... 등등 ...

나는 그 진실의 블록을 추출하는 방법을 모른다. 어떻게 든 나를 도울 수 있기를 바랍니다.

답변

4

당신은 rle을 사용하고 같은 것을 할 수있는 : 여기

myL = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE) 
num = c(1, 4, 3, 7, 3, 2 , 23, 98, 5) 
X <- rle(myL) 
Y <- rep(seq_along(X$lengths)[X$values], X$lengths[X$values]) 
tapply(num[myL], Y, sum) 
    1 3 5 
    8 2 103 

, 8-TRUE의 합계의 첫 번째 그룹, 두 번째 그룹 (하나 개의 값은) 2, 세 번째 그룹 (98, 5 이 유용 할 것이다 TrueSeq라는 기능을 갖는 대안


103) 합계 my "SOfun" package from GitHub 설치.

로 설치 :이 허용

TrueSeq(myL) 
# [1] 1 1 1 0 0 2 0 3 3 

간단히 할 :

tapply(num, TrueSeq(myL), sum) 
# 0 1 2 3 
# 33 8 2 103 

또는, 더 나은의 zero2NA 인수를 사용

library(devtools) 
install_github("mrdwab/SOfun") 

기능은이 수행 TrueSeq에서 다음과 같이 표시됩니다.

tapply(num, TrueSeq(myL, zero2NA=TRUE), sum) 
# 1 2 3 
# 8 2 103 
1

것은이 당신이 diff 기능과 같이 사용할 수 있습니다 차단 찾으려면 : 1이있을 때

vec = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE) 
c(vec[1]==TRUE,diff(vec)) 
## [1] 1 0 0 -1 0 1 -1 1 0 

블록의 시작을 0으로 -1이 될 때까지 당신이 요소를 추가 어디 잘못된 블록의 시작을 나타냅니다.

관련 문제