2012-09-04 3 views
8

Ich möchte neue Elemente zählen, die in früheren Jahren nicht vorhanden waren. Im Beispielzählen neue Elemente in Vektor-Liste

Beispieldaten:

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

Ich möchte die Ausgabe

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

Erfolglos Code erhalten:

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

Bitte studieren Sie die Terminologie. Sie haben eine Liste von Vektoren, keine Datenrahmen. – Andrie

+0

Danke @Andrie, behoben. – dmvianna

+1

'diff (sapply (Reduzieren (Vereinigung, var1, akkumulieren = WAHR), Länge))' # [1] 1 1 0 –

Antwort

5

fast da, aber seine besser zu benutzen Vektor-Indizierung mit dem Offset zu arbeiten und das immer bekannte Anfangselement hinzufügen, danach:

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

Wohin mit der maximalen Anzahl von Funktionsaufrufen in einer einzigen Zeile? ;-) (Ernsthaft, das ist ein gewaltiger Overkill.) –

+0

Nun, 80 Zeichen sind so passé;) – James

4

Unter der Annahme, dass var1 wird nach Jahren sortiert, und dass für das Jahr 2003 würden Sie 3 statt 1 mögen, könnten Sie versuchen,

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, wenn Sie absolut sicher sind, dass 2003 0 sein sollte (was ich als Ausnahme von der Logik sehen), dann könnten Sie folgendes tun:

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

@plannapus, Guter Vorschlag. Oben geändert. – BenBarnes

+0

Auch gibt es keine früheren Jahre für 2003, also sollte es 0 sein, wenn wir die Anzahl der Dinge zählen, die in früheren Jahren gefunden wurden? –

+1

@GavinSimpson, danke für den Kommentar. Ich denke, das OP wollte die Anzahl der Elemente in Jahr 1, die in keinem vorherigen Jahr vorhanden waren. Obwohl ich verstehen kann, 0 für 2003 zu haben, scheint das eine Ausnahme von der Regel zu sein. Es wäre eine einfache Änderung, aber ein "harter Code". – BenBarnes