2012-09-04 12 views
8

Voglio contare nuovi elementi che non erano presenti negli anni precedenti. Nell'esempiocontiamo nuovi elementi nell'elenco vettoriale

dati del campione:

var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4) 

Vorrei ottenere l'output

newcount <- list('2003' = 0, '2004' = 1, '2005' = 1, '2006' = 0) 

codice non riuscita:

newcount <- mapply(setdiff, var1, seq_along(var1), function(i) 
      {if (i > 1) {Reduce(union, var1[i-1], accumulate=T)}}, length) 
+2

Si prega di studiare la terminologia. Hai una lista di vettori, non di frame di dati. – Andrie

+0

Grazie @Andrie, corretto. – dmvianna

+1

'diff (sapply (Riduci (unione, var1, accumulate = TRUE), lunghezza))' # [1] 1 1 0 –

risposta

5

Ci siamo quasi, ma la sua meglio da usare vector l'indicizzazione di lavorare con l'offset e aggiungere l'elemento iniziale da sempre noto in seguito:

lapply(c(list(`2003`=integer(0)), 
     mapply(setdiff,var1[-1], 
       Reduce(union,var1,accumulate=TRUE)[-length(var1)])),length) 
$`2003` 
[1] 0 

$`2004` 
[1] 1 

$`2005` 
[1] 1 

$`2006` 
[1] 0 
+0

Dove stai andando per il numero massimo di chiamate di funzione in una linea singola con quella? ;-) (Scherzi a parte, è un enorme overkill.) –

+0

Beh, 80 caratteri è così passé;) – James

4

Supponendo che var1 è ordinata per anno, e che per il 2003 si piacerebbe 3 invece di 1, si potrebbe provare

newcount <- lapply(seq_along(var1),function(x){ 
    prev<-unlist(var1[seq_len(x-1)]) 
# Improvement suggested by plannapus 
    sum(!var1[[x]]%in%prev) # length(which(!var1[[x]]%in%prev)) 
}) 

names(newcount)<-names(var1) 

newcount 
# $`2003` 
# [1] 3 

# $`2004` 
# [1] 1 

# $`2005` 
# [1] 1 

# $`2006` 
# [1] 0 

OK, se si è assolutamente sicuri che il 2003 dovrebbe essere 0 (che io vedo come eccezione alla logica), allora si potrebbe fare la seguente:

newcount <- c(0, lapply(seq_along(var1)[-1],function(x){ 
    prev<-unlist(var1[seq_len(x-1)]) 
    sum(!var1[[x]]%in%prev) 
})) 
+0

@plannapus, buon suggerimento. Modificato sopra. – BenBarnes

+0

Inoltre, non ci sono anni precedenti per il 2003, quindi dovrebbe essere 0 se contiamo il numero di cose trovate negli anni precedenti? –

+1

@GavinSimpson, grazie per il commento. Penso che l'OP volesse il numero di elementi dell'anno che non erano presenti in nessun anno precedente. Quindi, anche se posso capire di avere 0 per il 2003, sembra essere un'eccezione alla regola. Sarebbe un cambiamento facile, ma un "codice difficile". – BenBarnes

Problemi correlati