user3780892
user3780892

Reputation: 31

Using an apply function on multiple subsets of a vector

I've been scrounging around for a solution for this for a while, but there doesn't seem to be anything that can solve this seemingly simple problem I'm having.

Long story short, I'm looking to run a function on multiple subsets of a vector, but I am trying to avoid a for loop.

As a simple example

x <- runif(20)

index <- round(runif(10,1,10))
[1] 7 8 4 6 9 3 1 2 8 7

Now what I'm trying to do is run an apply function that would find the (let's say) mean of the last 7 entries of x, then the last 8 entries of x, then the last 4 entries of x, etc, etc.

This would be using the tail(x, n) function in some way, but I've been getting erroneous results because the apply family of functions will either return one result for each element in its passed arguments (like in mapply) which won't work because length(x) != length(index), or one result for each element in the passed object (in this case, the 20 elements of x). I'm looking to get 10 means as the output.

Thoughts? Let me know if I can clear up the example somewhat.

Upvotes: 3

Views: 960

Answers (1)

alko989
alko989

Reputation: 7918

You can still use xapply functions. You can try something like:

set.seed(1)
x <- runif(20)
index <- round(runif(10,1,10))
## [1] 5 5 9 8 4 1 4 6 3 9
sapply(index, function(n) mean(tail(x, n)))
## [1] 0.4622008 0.4622008 0.5185548 0.5222463 0.4519646 0.2787476 0.4519646
## [8] 0.4939800 0.2748015 0.5185548

Just to check:

mean(tail(x, 5))
## [1] 0.4622008
mean(tail(x, 9))
## [1] 0.5185548

Hope it helps,

alex

Upvotes: 1

Related Questions