2016-10-14 4 views
2

Filling habe ich einen Vektor:einen leeren Vektor mit Werten in Bezug auf den ersten Wert in dem Vektor

sample.vector 
     1 
     1 
     0 
     0 
     14 
     1 
     1 
     0 
     1 
     12 

I einen zweiten Vektor mit dem folgenden Code erstellt:

second.vector <- c(1, rep(NA, length(sample.vector))) 

der diese hergestellt:

second.vector 
     1 
     NA 
     NA 
     NA 
     NA 
     NA 
     NA 
     NA 
     NA 
     NA 
     NA 

ich möchte second.vector so füllen, dass die NA s mit 0 + t ersetzt werden er Wert in der Reihe darüber (d. h. die 1 in der ersten Zeile des zweiten Vektors) wenn sample.vector < 3 oder 1 + der Wert in der Zeile darüber (d. h. was auch immer dieser Wert sein mag) wenn sample.vector > 3.

Mit anderen Worten:

R, möchte ich Sie in Zeile suchen [n] in sample.vector. Wenn der Wert kleiner als drei ist, möchte ich, dass Sie die NA in second.vector durch den Wert über dieser NA ersetzen. Wenn der Wert in Zeile [n] größer als 3 ist, möchte ich, dass Sie die NA in second.vector mit dem Wert über dieser NA füllen, aber 1 dazu hinzufügen.

Tun Sie dies für jede Zeile innerhalb sample.vector, so dass jede in second.vector durch Werte ersetzt wird.

So ist der Vektor, der ich bin der Hoffnung, zu bekommen:

second.vector 
     1 
     1 
     1 
     1 
     1 
     2 
     2 
     2 
     2 
     2 
     3 

ich das versucht habe:

second.vector[2:length(second.vector)] <- 
    ifelse(sample.vector[1:length(sample.vector)] > 3, 
    second.vector[1:length(second.vector)]+1, 
    second.vector[1:length(second.vector)]+0) 

Aber es gibt nur die zweite Reihe von second.vector a 1, anstatt den gesamten Vektor aufzufüllen.

Irgendwelche Gedanken dazu, wie man das macht?

+5

'cumsum (as.numeric (sample.vector> 3)) + 1' – cuttlefish44

+0

was ist, wenn der Wert = 3? – bouncyball

+0

@bouncyball Dies ist nur ein Beispiel; Die Daten, die ich habe, sind so, dass die Werte entweder 1,0 oder sehr viel größer als 2 oder 3 –

Antwort

2

cumsum() gibt kumulative Summen zurück. Zum Beispiel cumsum(c(3, 7, 1)) ist [1] 3 10 11

sample.vector <- c(1,1,0,0,14,1,1,0,1,12) 
library(dplyr) # just to explain 

(sample.vector > 3) %>% # [1] FALSE FALSE FALSE FALSE TRUE ... 
    as.numeric() %>%  # [1] 0 0 0 0 1 ... # but this line is unnecessary, thanks @Pierre Lafortune 
    cumsum() %>%  # [1] 0 0 0 0 1 1 1 1 1 2 # do cumulative sums 
     + 1    # [1] 1 1 1 1 2 2 2 2 2 3 # what you want 

# summarizing the above, 
cumsum(sample.vector > 3) + 1 
Verwandte Themen