Hi, I am very new to R, so I apologize if I have missed some trivial thing in the manuals/archives. I am trying to get rid of for loops in my code and replace them with R vector magic (with no success). Let's say I have 2 vectors of the same length: a <- c(2, 3, 7, 5) b <- c(4, 7, 8, 9) What I'd like to do is to generate a list(?) of 4 sequences using a[i] as a start indices, and b[i] as end indices: 2,3,4 3,4,5,6,7 7,8 5,6,7,8,9 My first guess: "a:b", of course, does not work - only one sequence gets generated using the first values from both vectors, plus a warning. Is there a special syntax I can use to make ":" treat its operands as vectors? More generally, is there a standard way to apply some arbitrary functions to two or more vectors in an element-by-element fashion? For instance, sum(a,b) will sum all values in both vectors; how can I make it produce a vector of pairwise sums instead? Thank you, Anuta [[alternative HTML version deleted]]
On 24/10/2007, at 4:15 PM, Anya Okhmatovskaia wrote:> Hi, > > I am very new to R, so I apologize if I have missed some trivial > thing in > the manuals/archives. I am trying to get rid of for loops in my > code and > replace them with R vector magic (with no success). > > Let's say I have 2 vectors of the same length: > a <- c(2, 3, 7, 5) > b <- c(4, 7, 8, 9) > > What I'd like to do is to generate a list(?) of 4 sequences using a > [i] as a > start indices, and b[i] as end indices: > 2,3,4 > 3,4,5,6,7 > 7,8 > 5,6,7,8,9 > > My first guess: "a:b", of course, does not work - only one sequence > gets > generated using the first values from both vectors, plus a warning. > Is there > a special syntax I can use to make ":" treat its operands as vectors? > More generally, is there a standard way to apply some arbitrary > functions to > two or more vectors in an element-by-element fashion? For instance, > sum(a,b) > will sum all values in both vectors; how can I make it produce a > vector of > pairwise sums instead?Cute question! The first idea that pops into my head is apply(cbind(a,b),1,function(x){x[1]:x[2]}) This works --- but there may be better ideas. cheers, Rolf Turner ###################################################################### Attention:\ This e-mail message is privileged and confid...{{dropped:9}}
> a <- c(2, 3, 7, 5)> b <- c(4, 7, 8, 9) > mapply(seq, a, b) [[1]] [1] 2 3 4 [[2]] [1] 3 4 5 6 7 [[3]] [1] 7 8 [[4]] [1] 5 6 7 8 9 > mapply(sum, a, b) [1] 6 10 15 14 > hope this helps, Tony Plate Anya Okhmatovskaia wrote:> Hi, > > I am very new to R, so I apologize if I have missed some trivial thing in > the manuals/archives. I am trying to get rid of for loops in my code and > replace them with R vector magic (with no success). > > Let's say I have 2 vectors of the same length: > a <- c(2, 3, 7, 5) > b <- c(4, 7, 8, 9) > > What I'd like to do is to generate a list(?) of 4 sequences using a[i] as a > start indices, and b[i] as end indices: > 2,3,4 > 3,4,5,6,7 > 7,8 > 5,6,7,8,9 > > My first guess: "a:b", of course, does not work - only one sequence gets > generated using the first values from both vectors, plus a warning. Is there > a special syntax I can use to make ":" treat its operands as vectors? > More generally, is there a standard way to apply some arbitrary functions to > two or more vectors in an element-by-element fashion? For instance, sum(a,b) > will sum all values in both vectors; how can I make it produce a vector of > pairwise sums instead? > > Thank you, > Anuta > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >