2012-09-04 7 views
8

Quiero contar los elementos nuevos que no estaban presentes en años anteriores. En el ejemplocontar elementos nuevos en la lista de vectores

datos de la muestra:

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

me gustaría obtener la salida

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

Código sin éxito:

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

Estudie la terminología. Usted tiene una lista de vectores, no marcos de datos. – Andrie

+0

Gracias @Andrie, arreglado. – dmvianna

+1

'diff (sapply (Reduce (union, var1, accumulate = TRUE), length))' # [1] 1 1 0 –

Respuesta

5

Casi allí, pero su mejor usar vector de indexación para trabajar con el offset y añadir el elemento inicial siempre conocido después:

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

¿A dónde va el número máximo de llamadas a función en una sola línea con esa? ;-) (En serio, eso es una exageración masiva.) –

+0

Bueno, 80 caracteres son tan pasados;) – James

4

Suponiendo que var1 se ordena según el año, y que para 2003 desea 3 en lugar de 1, podría intentar

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 

bien, si está absolutamente seguro de que el año 2003 será 0 (que veo como una excepción a la lógica), entonces usted podría hacer lo siguiente:

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

@plannapus, Buena sugerencia. Cambiado arriba. – BenBarnes

+0

Además, no hay años anteriores para 2003, entonces debería ser 0 si contamos el número de cosas encontradas en años anteriores? –

+1

@GavinSimpson, gracias por el comentario. Creo que el OP quería la cantidad de elementos en el año i que no estaban presentes en ningún año anterior. Entonces, aunque puedo entender tener 0 para 2003, parece ser una excepción a la regla. Sería un cambio fácil, pero un "código difícil". – BenBarnes

Cuestiones relacionadas