[R] related to my previous sapply question]

Marc Schwartz MSchwartz at mn.rr.com
Tue Jun 27 04:44:13 CEST 2006


On Mon, 2006-06-26 at 20:46 -0500, markleeds at verizon.net wrote:
> in my previous post in which i asked about creating sequences
> from two vectors of numbers,  all suggestions worked.
> 
> tradevectors<-mapply(seq,from=tempa,to=tempb)
> 
> or 
> 
> tradevectors<-sapply(1:length(tempa),function(x) seq(tempa[x],tempb[x])
> 
> >both return a list with 3 components.
> 
> the problem is that i want to take these 3 sequences and
> 
> use them as the indices of two other vectors, X and Y and mutiply them  ( element by element )
> 
> 
> >so, i tried 
> >
> >temp<-sapply(1:length(tradevectors),function(i)X[tradevectors[[i]]]*Y[tradevectors[[i]]]
> 
> 
> basically, the sequence output from the previous command are
> indices to two vectors that i want to multiply ( element
> by element ).
> 
> but, the message i get is that i cannot coerce list object to double. 
> 
> i looked up the info on unlist, but that just
> makes long vector. i need 3 vectors.

How about something like this:

  tempa <- c(4, 6, 10)

  tempb <- c(11, 23, 39)

  tradevectors <- mapply(seq, from = tempa, to = tempb)


> tradevectors
[[1]]
[1]  4  5  6  7  8  9 10 11

[[2]]
 [1]  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

[[3]]
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
[23] 32 33 34 35 36 37 38 39

  
  X <- seq(2, 80, 2)
  Y <- 1:40

> X
 [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44
[23] 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80

> Y
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22
[23] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40



> lapply(tradevectors, function(x) X[x] * Y[x])
[[1]]
[1]  32  50  72  98 128 162 200 242

[[2]]
 [1]   72   98  128  162  200  242  288  338  392  450  512  578  648
[14]  722  800  882  968 1058

[[3]]
 [1]  200  242  288  338  392  450  512  578  648  722  800  882  968
[14] 1058 1152 1250 1352 1458 1568 1682 1800 1922 2048 2178 2312 2450
[27] 2592 2738 2888 3042


For example, the first value in [[1]] is 32, which is:

  X[4] * Y[4]    # The '4' comes from tradevectors[[1]][1]

which is:

  8 * 4


The other list elements are similarly constructed.  You can use lapply()
when you want to apply functions to individual list elements (in this
case vectors) as you traverse the list tree. See ?lapply

HTH,

Marc Schwartz



More information about the R-help mailing list