2017-02-09 5 views
7

Ich kann nicht herausfinden, wie ein Vektor 3-50 zu produzieren, wo die geraden Zahlen zweimal repliziert werden und die ungeraden Zahlen einmal, so dass der VektorReplizieren abwechselnd Vektorwerte

3, 4, 4, 5, 6, 6, 7, 8, 8, 9, ..., 50, 50 

Antwort

10

rep() wäre wird Mache den Trick.

x <- 3:50 
rep(x, (x %% 2 == 0) + 1L) 
# [1] 3 4 4 5 6 6 7 8 8 9 10 10 11 12 12 13 14 14 15 16 16 17 
# [23] 18 18 19 20 20 21 22 22 23 24 24 25 26 26 27 28 28 29 30 30 31 32 
# [45] 32 33 34 34 35 36 36 37 38 38 39 40 40 41 42 42 43 44 44 45 46 46 
# [67] 47 48 48 49 50 50 

x %% 2 == 0 gibt einen logischen Vektor, der anzeigt, welche Elemente von x selbst sind. Da die ganzzahligen Werte TRUE und FALSE1 bzw. 0 sind, ergibt das Hinzufügen von 1 zu x %% 2 == 0 den Vektor, den wir für unser times Argument in rep() benötigen. Wenn wir Golf spielen, können wir es auf rep(x, (!x %% 2) + 1L) verkürzen.

Beachten Sie, dass diese Methode auch nützlich ist, wenn unser Originalvektor nicht sequenziell ist, und wir wollen immer noch die geraden Werte repliziert.

v <- c(1, 2, 4, 3, 6) 
rep(v, (!v %% 2) + 1L) 
# [1] 1 2 2 4 4 3 6 6 
+5

und ein wenig mehr hart-codiert: 'rep (3:50, rep (1: 2, 24))' – lmo

5

Mit Recycling, ein wenig manuelle Art und Weise:

x <- 3:50 
sort(c(x, x[c(FALSE, TRUE)])) 
8

wir zusammen einen Vektor aller Werte und einen Vektor der geraden Zahlen zusammenführen können:

sort(c(3:50, 2:25*2))