Pork Chop
Pork Chop

Reputation: 29387

Matrix elements manipulation

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)

What I want to do is to compare the numbers In the first column of this matrix, and if the first number is equal to the second consecutive number in the column (in this case if 1 = 1, and so on) then I want to add the corresponding numbers in the second column together (as in 10 + 10 = 20, and so on) and that would be only one value and I want then to store this output in a separate vector.

The output from the matrix I am looking for is as follows:

     [,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  

I am quite new to R and struggling with this. Thank you in advance!

Upvotes: 1

Views: 160

Answers (2)

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193527

This sounds like a job for rle and tapply:

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

Explanation:

  • rle identifies the run-lengths of the items in the first column of matrix "a".
  • We create a grouping variable for tapply from the run-lengths using rep(seq_along(A), A).
  • We put those two things together in tapply to get the sums you want.

Upvotes: 1

Henrik
Henrik

Reputation: 67778

Is this what you want? I bet there are clean base solutions, but I give it a try with rollsum in zoo package:

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

Upvotes: 1

Related Questions