# [R] Matrix subscripting to wrap around from end to start of row

David Winsemius dwinsemius at comcast.net
Wed Oct 13 23:07:50 CEST 2010

```On Oct 13, 2010, at 4:54 PM, Alisa Wade wrote:

> Thanks, David for the response.
>
> Unfortunately, that only works for the case where I happen to only
> want the last and first month "wrap".
> But it doesn't work for any other case, e.g., say I want months
> start.month = 4, end.month = 2.
> Now
>
> would give me just the average of months 4 and 2, when I want the
> average of months 4, 5, 1, 2.
>

Then just put in the true start's and end's of the loop/series/ring/
whatever:

start=4; end=2; year.avg = apply(month.data[, c(1:start,end:5)], 1,
mean)

If you don't know the length of the full cycle, the has to be some way
to derive length(series-object):

start=4; end=2; year.avg = apply(month.data[,
c(1:start,end:length(series-object))], 1, mean)

--
David.
> I could do an if statement:
> start = 4
> end = 2
> if (end < start ) {
>   start.script = paste(start, ":5", sep="")
>   end.script = paste("1:", 5-end, sep="")
>   final.script = paste("c(",start.script,",",end.script,")", sep="")}
> out = apply(month.data[,final.script], 1, mean)
>
> But, alas, final.script is now a string, and it can't be passed that
> way.
>
> Is there either a way to tell the script that 4:2 does not mean
> 4,3,2, but it means 4,5,1,2
> or is there a way to pass final.script into the subscript in the
> apply command
> or am I missing something else?
>
> Thanks again,
> Alisa
>
>
>
> On Wed, Oct 13, 2010 at 2:23 PM, David Winsemius <dwinsemius at comcast.net
> > wrote:
>
> On Oct 13, 2010, at 4:10 PM, Alisa Wade wrote:
>
> Perhaps it is just that I don't even know the correct term to search
> for,
> but I can find nothing that explains how to wrap around from the end
> to a
> start of a row in a matrix.
>
> For example, you have a matrix of 2 years of data, where rows are
> years, and
> columns are months.
> month.data = matrix(c(3,4,6,8,12,90,5,14,22, 8), nrow = 2, ncol=5)
>
> I would like to take the average of months 5:1  for each year (for
> row 1
> =12.5). However, I am passing the start month (5) and the end month
> (1) as
> variables.
>
> I would like to do something like
>
> year.avg = apply(month.data[, start.month:end.month], MARGIN=1, mean)
>
> But that gives me the average of months 1:5. (for row 1 =9.6)
>
> I know I could use:
> apply(month.data[, c(1,5)], 1, mean)
>
> > start=5; end=1; year.avg = apply(month.data[, c(start,end)], 1,
> mean)
> > year.avg
> [1] 12.5  6.0
>
>
> but I don't know how to pass start.month, end.month into that format
> that
> because paste or sprintf forces them to strings, which are not
> accepted in a
> subscript.
>
> I have the feeling I am unaware of some obvious trick.
> Any ideas would be greatly appreciated!
>
> *****************************************************
> Postdoctoral Center Associate
>
>
> David Winsemius, MD
> West Hartford, CT
>
>
>
>
> --
> *****************************************************