Skip to content

repeating values in an index two by two

8 messages · Federico Calboli, andrija djurovic, Patrick Burns +4 more

#
Hi All,

I am trying to create an index that returns something like

1,2,1,2,3,4,3,4,5,6,5,6,7,8,7,8

and so on and so forth until a predetermined value (which is obviously even).  I am trying very hard to avoid for loops or for loops front ends.

I'd be obliged if anybody could offer a suggestion.

BW

F
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 881 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20131111/7bc5cbcb/attachment.bin>
#
Hi,

first off, thanks for the suggestion.  I managed to solve it by doing:

IND = rep(c(T,T,F,F), 5)
X = rep(NA, 20)
X[IND] = 1:10
X[!IND] = 1:10

which avoids any function -- I think mapply, apply etc call a for loop internally, which I'd rather avoid.

BW

F
On 11 Nov 2013, at 12:35, andrija djurovic <djandrija at gmail.com> wrote:

            
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 881 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20131111/094d9112/attachment.bin>
#
function(x) {
     one <- matrix(1:x, nrow=2)
     as.vector(rbind(one, one))
}
<environment: 0x000000000daaf1c0>
 > f1(8)
  [1] 1 2 1 2 3 4 3 4 5 6 5 6 7 8 7 8

Pat
On 11/11/2013 12:11, Federico Calboli wrote:

  
    
#
Here's a rather extreme solution:

 foo<-rep(1:6,each=2)
Rgames> foo
 [1] 1 1 2 2 3 3 4 4 5 5 6 6

Rgames> foo[rep(c(1,3,2,4),3)+rep(c(0,4,8),each=4)]
 [1] 1 2 1 2 3 4 3 4 5 6 5 6

In the general case, then, it would be something like

foo<- rep(1:N, each = 2)  # foo is of length(2*N)

foo[rep(c(1,3,2,4),2*N/4 + rep( seq(0, 3*N/4,by=4),each=4)]

Note that the refolding requires the sequence to have length a multiple of
4.




Patrick Burns wrote

            

            
--
View this message in context: http://r.789695.n4.nabble.com/repeating-values-in-an-index-two-by-two-tp4680210p4680234.html
Sent from the R help mailing list archive at Nabble.com.
#
Or you can use the integer divide and remainder operators:
   > n <- 30
   > x <- seq(0, len=n)
   > + (x %% 2) + (x %/% 4)*2 + 1 # period 2 oscillator + jump by 2 every fourth
    [1]  1  2  1  2  3  4  3  4  5  6  5  6  7  8  7
   [16]  8  9 10  9 10 11 12 11 12 13 14 13 14 15 16

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com