Sono un nuovo arrivato relativamente a R, quindi mi dispiace se c'è una risposta ovvia a questo. Ho esaminato altre domande e penso che "applicare" sia la risposta, ma non riesco a capire come usarlo in questo caso.Modi più efficienti per utilizzare R rispetto ai cicli "for"
Ho un sondaggio longitudinale in cui i partecipanti sono invitati ogni anno. In alcuni anni non riescono a prendere parte e, a volte, muoiono. Ho bisogno di identificare quali partecipanti hanno preso parte a una "serie" coerente sin dall'inizio del sondaggio (cioè se si fermano, si fermano per sempre).
Ho fatto questo con un ciclo 'for', che funziona bene nell'esempio qui sotto. Ma ho molti anni e molti partecipanti, e il ciclo è molto lento. C'è un approccio più veloce che potrei usare?
Nell'esempio, TRUE significa che hanno partecipato a quell'anno. Il loop crea due vettori - 'finalyear' per l'ultimo anno in cui hanno preso parte e 'streak' per mostrare se sono stati completati tutti gli anni prima dell'ultimo anno (cioè i casi 1, 3 e 5).
dat <- data.frame(ids = 1:5, "1999" = c(T, T, T, F, T), "2000" = c(T, F, T, F, T), "2001" = c(T, T, T, T, T), "2002" = c(F, T, T, T, T), "2003" = c(F, T, T, T, F))
finalyear <- NULL
streak <- NULL
for (i in 1:nrow(dat)) {
x <- as.numeric(dat[i,2:6])
y <- max(grep(1, x))
finalyear[i] <- y
streak[i] <- sum(x) == y
}
dat$finalyear <- finalyear
dat$streak <- streak
Grazie!
un sacco di risposte - qualcuno vuole per creare un set di dati più grandi e li punto di riferimento? Quanto è grande il set di dati in modo che sia possibile creare un banco di prova rappresentativo per il benchmarking? – Spacedman
Ci sono circa 250.000 casi e 25 anni. Tutte le risposte qui sotto risolvono il mio problema - grazie a tutti! Se le persone sono interessate, potrei creare un set di dati rappresentativo per testare approcci diversi. –