Rang variable Gruppe (dplyr)
Ich habe einen dataframe mit den Spalten x1, x2, group
und ich möchte, um ein neues dataframe mit einer extra Spalte rank
zeigt, dass die Reihenfolge der x1
in seiner Gruppe.
Es ist eine Frage im Zusammenhang mit hier, aber die akzeptierte Antwort scheint nicht mehr zu funktionieren.
Bis hier, es ist in Ordnung:
library(dplyr)
data(iris)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species)
Aber wenn ich versuche die Ränge von Gruppe:
by_species <- mutate(by_species, rank=row_number())
Der Fehler ist:
Fehler in der Reihe(x, Krawatten.method = "erste", na.last = "keep") :
argument "x" is missing, with no default
Update
War das problem einige Konflikte zwischen dplyr
und plyr
. Um den Fehler zu reproduzieren, laden Sie beide Pakete:
library(dplyr)
library(plyr)
data(iris)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(rank=row_number())
# Error in rank(x, ties.method = "first", na.last = "keep") :
# argument "x" is missing, with no default
Entladen plyr
es funktioniert wie es soll:
detach("package:plyr", unload=TRUE)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(rank=row_number())
by_species %>% filter(rank <= 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species rank
## (dbl) (dbl) (dbl) (dbl) (fctr) (int)
## 1 4.3 3.0 1.1 0.1 setosa 1
## 2 4.4 2.9 1.4 0.2 setosa 2
## 3 4.4 3.0 1.3 0.2 setosa 3
## 4 4.9 2.4 3.3 1.0 versicolor 1
## 5 5.0 2.0 3.5 1.0 versicolor 2
## 6 5.0 2.3 3.3 1.0 versicolor 3
## 7 4.9 2.5 4.5 1.7 virginica 1
## 8 5.6 2.8 4.9 2.0 virginica 2
## 9 5.7 2.5 5.0 2.0 virginica 3
- Sind Sie sicher, dass der Befehl
by_species <- mutate(by_species, rank=row_number())
ist die ein die den Fehler produziert ? Es funktioniert für mich, und deine Fehler bezieht sich auf dierank
Funktion, nicht dierow_number
- Funktion, die verwendet wird. Auch, wenn Sierank
Sie brauchen ein argument wie inrank(x)
(wox
ist das, was Sie ordnen wollen).row_number
dies erforderlich ist. - hmm Nein, ich bin mir nicht sicher... :O
- Es muss sich nicht beschweren, wenn ich
rank
:by_species <- mutate(by_species, myrank=rank(Sepal.Length))
- Dein post nicht verwenden
rank
(der Teil, der Sie hervorgeht, die Probleme verursacht). Wennrank
für Sie arbeitet, dann bedeutet das, dass dieses problem gelöst ist, oder bin ich etwas fehlt ? - Ich glaube, ich könnte etwas fehlen zu :), Wenn ich
rank
stattrow_number
es nicht zu beschweren, aber es nicht tun, was ich will (Rang Spalte sollte wie 1,2,3... 1,2,3.... 1,2,3....) - siehe Bearbeiten (und danke für deine Geduld!)
- Warum machst du das in zwei Teile? Können Sie, machen dies zu einem vollständigen Befehl, zu ordnen und Rang?
- Ich denke, Sie sind nur nicht alle Ihre Stücke zusammen.
by_species <- iris %>% arrange(Species, Sepal.Length) %>% group_by(Species) %>% mutate(rank = rank(Sepal.Length, ties.method = "first"))
für mich funktioniert. Sie können dies testen, indem ausgeführtby_species %>% slice(1:3)
. - Dein Skript erzeugt die gewünschte Ausgabe da ist. Ich Stimme zu schließen, da nicht reproduzierbar.
- siehe den edit. Deine Anweisungen funktionieren nicht für mich.
- Ich habe es in zwei Teile, ohne Grund, nur zum Debuggen.
- Cut/past die Antwort-code. Entsteht dadurch ein Fehler für Sie oder das, was Sie erwarten ?
- Wenn der code in der Antwort nicht funktioniert, können Sie neu starten möchten R und laden Sie einfach
dplyr
(d.h. die minimale Anzahl von Paketen zu beheben). Dies sollte reduzieren die chance, Funktionen aus einem anderen Paket unerwartet. - getan. Kein Fehler, aber der Rang wird immer noch global und nicht durch die Gruppe... mein dplyr-version ist 0.4.3
- Wenn Sie tun genau das, was in der Antwort, aber immer unterschiedliche Ergebnisse, scheint dies eher wie ein Problem mit Ihrer Umgebung (Plattform?). Wenn Sie Zugang zu einem anderen system, vielleicht können Sie versuchen, den code in die Antwort auch dort (d.h. der ist es gerade der Computer, den Sie verwenden). Ich habe versucht, eine version der Antwort, wo ich die package Namen in der call auf die Funktion hat es noch gut funktioniert für mich:
by_species <- datasets::iris %>% dplyr::arrange(Species, Sepal.Length) %>% dplyr::group_by(Species) %>% dplyr::mutate(rank = base::rank(Sepal.Length, ties.method = "first"))
- Ich habe etwas gesehen ähnlich wie beim laden
plyr
nachdplyr
... - Bingo! Ich neu gestartet, R @steveb vorgeschlagen und es funktioniert. Ich werde Bearbeiten Sie die Frage mit den reproduzierbaren Fehler, für den Datensatz. Danke an alle!
- Gut zu hören, dass es funktionierte. Habe Sie durch Zufall installieren oder aktualisieren Sie alle Pakete, die einfach vor einem Neustart ? Das kann oft (aber nicht immer) zu Problemen führen.
- Zwischen dem Fehler und meinen neu starten, meinst du? Überhaupt nicht.
- Ich stolperte zurück und dachte, möchten Sie vielleicht fügen Sie etwas zu Ihrer Sektion Bearbeiten. Es scheint, dass Sie nicht brauchen, um zu entladen
plyr
, können Sie laden Sie beide (plyr
unddplyr
), wenn Sie Lastplyr
ersten. - laden
plyr
und danndplyr
es scheint nicht zu funktionieren in meinem computer
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgender Code erzeugt das gewünschte Ergebnis, wie angegeben wurde.
dplyr
Lösung, ich bin putting eindata.table
Lösung in diesem Kommentar, wie es nützlich sein kann. Die folgenden arbeiten mitdata.table
:setDT(iris)[order(Species, Sepal.Length), .SD[1:3], by = Species]
Für zukünftige Leser, der Rang durch die Gruppe variable erreicht werden kann, mit base R. Pro die OP ' s
iris
Daten Beispiel Rang nachSepal.Length
: