gruppierte Operationen, die Ergebnis von der Länge nicht gleich um 1 oder die Länge der Gruppe in dplyr
Ich bin mir nicht sicher, welche Funktion verwenden, um Folgendes zu tun:
library(data.table)
dt = data.table(a = 1:4, b = 1:2)
dt[, rep(a[1], 3), by = b]
# b V1
#1: 1 1
#2: 1 1
#3: 1 1
#4: 2 2
#5: 2 2
#6: 2 2
Beide summarise
und mutate
sind unglücklich mit dieser Länge:
library(dplyr)
df = data.frame(a = 1:4, b = 1:2)
df %.% group_by(b) %.% summarise(rep(a[1], 3))
#Error: expecting a single value
df %.% group_by(b) %.% mutate(rep(a[1], 3))
#Error: incompatible size (3), expecting 2 (the group size) or 1
- Weiß nicht, ob es hilft, aber mit Ihren
dplyr
- code mit einemdata.table
arbeiten und mitplyr
kannst du auch mit einemdata.frame
. - danke, das ist interessant (so schön dies ist meist nur eine übung für mich um zu verstehen, wie
dplyr
- ich weiß nicht wirklich den Punkt sehen, der es mit einemdata.table
); klingt wie ein bug insummarise
dann - Siehe github.com/hadley/dplyr/issues/154
- +1 Dies ist ein interessanter Unterschied; hoffentlich die endgültige Lösung kann beliebige return-Längen für alle Gruppen.
- In diesem Fall
df %>% group_by(b) %>% slice(rep(1, 3))
funktioniert einwandfrei. Für rowwise Operationen, in denen jede Zeile gibt eine beliebige Anzahl von Werten, die Sie verwenden können, diedf %>% mutate(new = map(old, f)) %>% unnest()
idiom.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In
dplyr
version 0.2 könnten Sie dies tun, indem Sie diedo
Betreiber:do
tun können (obwohl beachten Sie die Kommentare in meiner "Antwort")Während @beginneR ' s Antwort funktioniert, es scheint nicht zu einem echten Ersatz für die
data.table
Verhalten. Bedenken Sie:hat die
dplyr
Umsetzung >200x langsamer.Vielleicht gibt es einen besseren Weg, dies zu tun mit
do
nicht erforderlich ist, aufrufendata.frame
jederdo
? Auch die syntax ist ein wenig beteiligt, was ist etwas, das sehr einfach indata.table
.Anders, als pro Hadley ' s Thema link, es scheint, dass diese voraussichtlich umgesetzt werden
dplyr
in 3.1, das aussieht, werden die nächsten release.