2017-04-13 3 views
5

Wenn ich eine neue Zeile in die ìris Datensatz mit hinzuzufügen:Zeile hinzufügen in jeder Gruppe dplyr und add_row mit()

iris <- as_tibble(iris) 

> iris %>% 
    add_row(.before=0) 

# A tibble: 151 × 5 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
      <dbl>  <dbl>  <dbl>  <dbl> <chr> 
1   NA   NA   NA   NA <NA> <--- Good! 
2   5.1   3.5   1.4   0.2 setosa 
3   4.9   3.0   1.4   0.2 setosa 

Es funktioniert. Also, warum kann ich nicht eine neue Zeile auf der jeweils „Teilmenge“ mit hinzuzufügen:

iris %>% 
group_by(Species) %>% 
add_row(.before=0) 

Error: is.data.frame(df) is not TRUE 
+1

Aktualisieren Sie Ihre Version von 'tibble', diese Fehlermeldung ist mindestens [drei Monate alt] (https://github.com/tidyverse/tibble/flame/b32c2b952afdeff93d422512a132ec6d0a2e2fbc/R/add.R#L35-L37). (Die neue Fehlermeldung lautet: "Kann keine Zeilen zu gruppierten Datenrahmen hinzufügen", was Ihre Frage beantwortet, warum es nicht funktioniert.) – r2evans

+5

Sie können 'do' verwenden, um jeder Gruppe eine Zeile hinzuzufügen:' iris%>% group_by (Art)%>% do (add_row (., .before = 0)) '. – JasonWang

+0

Danke JasonWang und r2evans. Ich habe meine Pakete aktualisiert und do() macht den Trick. – Dan

Antwort

3

Wenn Sie eine gruppierte Betrieb verwenden möchten, müssen Sie do wie JasonWang in seinem Kommentar beschrieben, wie auch andere Funktionen wie mutate oder summarise erwarten Sie ein Ergebnis mit der gleichen Anzahl von Zeilen wie der gruppierte Datenrahmen (in Ihrem Fall 50) oder mit einer Zeile (z. B. beim Zusammenfassen).

Wie Sie wahrscheinlich wissen, do kann im Allgemeinen langsam sein und sollte ein letzter Ausweg sein, wenn Sie Ihr Ergebnis auf eine andere Weise nicht erreichen können. Ihre Aufgabe ist ziemlich einfach, da nur zusätzliche Zeilen in Ihrem Datenrahmen hinzugefügt werden müssen, was durch einfache Indexierung, z. Schau dir den Ausgang von iris[NA, ] an.

Was Sie wollen, ist im Wesentlichen ein Vektor

indices <- c(NA, 1:50, NA, 51:100, NA, 101:150) 

(da die erste Gruppe in den Reihen 1 bis 50, die zweiten in 51 bis 100 und die dritten in 101-150) zu erstellen. Das Ergebnis ist iris[indices, ].

Eine allgemeinere Art des Aufbaus dieses Vektors verwendet group_indices.

indices <- seq(nrow(iris)) %>% 
    split(group_indices(iris, Species)) %>% 
    map(~c(NA, .x)) %>% 
    unlist 

(map kommt aus purrr, die ich nehme an, Sie geladen haben, wie Sie dies mit tidyverse markiert haben).

+1

Wow. Danke für die gründliche Antwort @konvas. FYI, nein ich wusste nicht, ist langsam und war nicht bewusst, die Alternative mit Purrr/Karte. Das macht SO so großartig. Jetzt weiß ich, wo ich nach Antworten auf dieses Problem suchen soll. Vielen Dank – Dan

Verwandte Themen