2013-09-06 2 views
1
b = c(1,1,2,2,3,3,4,4,1) 
c = c(10,10,20,20,30,30,40,40,5) 
a <- NULL 
a <- matrix(c(b,c), ncol=2) 

이 행렬의 첫 번째 열에서 숫자를 비교하고 첫 번째 숫자가 열의 두 번째 연속 번호와 같은지 비교합니다 (이 경우 1 = 1 인 경우). , 등) 두 번째 열에 함께 해당 숫자를 추가하려면 (10 + 10 = 20 등) 한 값일 것이므로이 출력을 별도의 벡터에 저장하고 싶습니다 . 다음과 같이행렬 요소 조작

내가 찾고 있어요 매트릭스의 출력은 다음과 같습니다

 [,1] [,2] [,3] 
[1,] 1 10 20 
[2,] 1 10 40 
[3,] 2 20 62 
[4,] 2 20 85 
[5,] 3 30 5 
[6,] 3 32 
[7,] 4 40 
[8,] 4 45 
[9,] 1 5 

나는이 꽤 R에 새로운 고민입니다. 미리 감사드립니다.

+0

매트릭스의 모든 열은 동일한 길이 여야합니다. 오히려 별도의 벡터 또는 두 개의 열이있는 행렬에 값을 저장하지 않겠습니까? – krlmlr

+0

일반적인 문제가 해결되는 것은 중요하지 않지만 (저는 믿습니다), 벡터'c'는 출력 행렬의 열 2와 다릅니다. – Henrik

+0

출력 매트릭스의 3 열에있는 5를 설명해 주시겠습니까? – Henrik

답변

1

rletapply위한 작업 같은 소리 :

b = c(1,1,2,2,3,3,4,4,1) 
c = c(10,10,20,20,30,30,40,40,5) 
a <- NULL 
a <- matrix(c(b,c), ncol=2) 

A <- rle(a[, 1])$lengths 
tapply(a[, 2], rep(seq_along(A), A), sum) 
# 1 2 3 4 5 
# 20 40 60 80 5 

설명 :

  • rle은 행렬 "a"의 첫 번째 열에있는 항목의 런 길이를 식별합니다.
  • rep(seq_along(A), A)을 사용하여 실행 길이에서 tapply에 대한 그룹화 변수를 만듭니다.
  • 두 가지를 모두 tapply에 넣으면 원하는 합계를 얻을 수 있습니다.
+0

Thx Amanda 귀하의 도움에 감사드립니다. 나는 처음에는 이것을 반복하기 위해 두 번 반복했다 (긴 평가로 바뀌었다). 유익한 책을 추천 해 주시겠습니까? [tag : r]의 [info] 페이지 (http://stackoverflow.com/tags/r/info)에서 도움을 받으실 수 있습니다. –

+0

@ user2753526 시작하기위한 많은 리소스가 포함되어 있습니다. – A5C1D2H2I1M1N2O1R2T1

+0

@ user2753526 도움이된다면 도움을 주시면 감사하겠습니다. 유용한 답변을 upvoting하거나 가장 유용한 답변 옆에있는 녹색 체크 표시를 클릭하여 받아 들일 수 있습니다. (+1) –

1

이게 원하는가요? 나는 깨끗한 base 솔루션이 내기,하지만 난 zoo 패키지에 그것을 rollsum으로 시도해 :

library(zoo) 
mm <- cbind(c(1, 1, 2, 2, 3, 3, 4, 4, 1), c(10, 10, 20, 20, 30, 30, 40, 40, 5)) 

# calculate all lagged sums of column 2 
sums <- rollsum(x = mm[ , 2], k = 2) 

# calculate differences between consecutive numbers in column 1 
diffs <- diff(mm[ , 1]) 

# select sums where diff is 0, i.e. where the two consecutive numbers in column 1 are equal. 
sums2 <- sums[diffs == 0] 

sums2 
# [1] 20 40 60 80 
+0

예 이것이 내가 원하는 것입니다. 그러나 마지막 번호와 첫 번째 숫자가 다음 번호와 비교하기 위해 필요합니다. 그리고 그 번호와 같지 않으면 두 번째 벡터에 해당 번호를 저장하십시오. 그래서 벡터의 마지막 "1"은 해당 값 "5"가 벡터에 저장됩니다. –

+0

글쎄, 나에게 당신의 질문을 업데이트 할 필요가 있다고 생각합니다. 5는 문제에 대한 원래의 설명을 따르지 않습니다 : "첫 번째 숫자가 두 번째 연속 숫자와 같으면 [...] 두 번째 열에 해당 숫자를 함께 추가하고 싶습니다. " – Henrik

+0

미안하지만 질문을 올바르게 표현해야합니다. 지금 내가 원하는 줄거리가 있습니다. 건배. 감사합니다. 모두에게 감사드립니다. 다행스럽게도 R의 위에 올라서서 마법사들처럼 당신을 도울 수있을 것입니다. –