2016-05-01 4 views
0

Wenn Sie zum Beispiel Spalte 1 als Übereinstimmungskriterium verwenden, rufen Sie replicate(length(v), sum(v)) für den Vektor der Spalte 2, v, für jeden Satz von Zeilen, die aus zusammenhängenden und übereinstimmenden Zeilen aus dem Datenrahmen A bestehen (einschließlich Mengen der Größe 1).Wie können wir eine Funktion auf einen Spaltenvektor aus jeder Menge zusammenhängender Zeilen eines Datenrahmens anwenden

A v 
a 12 
a 43 
b 8 
a 4 
b 12 
c 5 
c 9 
d 21 

-> 
55, 55, 8, 4, 12, 14, 14, 21 

Die Operation kann ein Vektor oder eine Liste von Vektoren, die wir zurück auf einen Vektor mit unlist() zwingen kann.

Antwort

3

Hier ist eine einfache Lösung mit data.table - einfach, weil es in rleid Funktion integriert ist, und weil es Griffe factors scheinbar

library(data.table) 
setDT(df)[, res := sum(v), by = rleid(A)] 
df 
# A v res 
# 1: a 12 55 
# 2: a 43 55 
# 3: b 8 8 
# 4: a 4 4 
# 5: b 12 12 
# 6: c 5 14 
# 7: c 9 14 
# 8: d 21 21 

Wenn wir Basis R wollen könnten wir entweder rleid neu erstellen oder kombinieren nur cumsum mit ave

with(df, ave(v, cumsum(c(TRUE, head(A, -1) != tail(A, -1))), FUN = sum)) 
# [1] 55 55 8 4 12 14 14 21 
+0

mit Ich habe bisher data.table vermied es versuchen. An den Orten, an denen ich hingehe, scheint es ein gutes Stück weit zu kommen - vielleicht sollte ich ihm eine Chance geben. Ich werde ein wenig warten, um zu sehen, ob jemand eine non data.table Lösung postet. –

+0

Was benutzen Sie? 'dplyr'? Basis R? Ist "A" ein "Faktor" oder eine "Charakterklasse"? –

+0

Ich benutze 'dplyr' und Base R so weit. Meine Sorge über die data.table ist, dass sie die Datenstruktur so verändert, dass sie nicht mit der Basis-R-Syntax funktioniert. Oder ist das ein Missverständnis? "A" ist Zeichentypdaten. Ich nehme an, es könnte leicht zu Faktoren gezwungen werden (verwenden Sie normalerweise keine Faktoren). –

2

Hier eine Option dplyr

library(dplyr) 
df1 %>% 
    group_by(A1 = cumsum(A!= dplyr::lag(A, default=A[1]))) %>% 
    mutate(res = sum(v)) %>% 
    ungroup() %>% 
    select(-A1) 
#  A  v res 
# (chr) (int) (int) 
#1  a 12 55 
#2  a 43 55 
#3  b  8  8 
#4  a  4  4 
#5  b 12 12 
#6  c  5 14 
#7  c  9 14 
#8  d 21 21 
+0

hmmm ... Also in den neueren Versionen Sie müssen jetzt 'dplyr :: lag' explizit angeben es scheint ... Ich habe mich gefragt, warum ich immer Fehler bekomme ... –

+0

@DavidArenburg Es gibt nur Probleme, wenn Sie' default' verwenden. Ich denke, sonst nannte es die Basis R lag – akrun

Verwandte Themen