R - Halten erste Beobachtung pro Gruppe identifiziert, die durch mehrere Variablen (Stata-äquivalent "by var1 var2 : halten, wenn _n == 1")
So habe ich aktuell vor einem problem in R, dass ich genau wissen, wie man mit in Stata, aber verschwendet haben über zwei Stunden zu erreichen, in R.
Verwendung der Daten.Bild unten, die Ergebnisse, die ich will, ist zu erhalten, die exakt die ersten Beobachtungen pro Gruppe, während die Gruppen gebildet werden, die von mehreren Variablen und sortiert werden, durch eine andere variable, d.h. die Daten.Rahmen mydata erhalten:
id <- c(1,1,1,1,2,2,3,3,4,4,4)
day <- c(1,1,2,3,1,2,2,3,1,2,3)
value <- c(12,10,15,20,40,30,22,24,11,11,12)
mydata <- data.frame(id, day, value)
Sollte umgestaltet werden:
id day value
1 1 10
1 2 15
1 3 20
2 1 40
2 2 30
3 2 22
3 3 24
4 1 11
4 2 11
4 3 12
Indem nur eine der Zeilen mit einem oder mehreren Gruppe-identificators (hier ist nur row[1]: (id,day)=(1,1))
Sortierung für den ersten Wert (also die Zeile mit dem niedrigsten Wert gehalten wird).
In Stata, würde dies einfach sein:
bys id day (value): keep if _n == 1
Fand ich eine Stück code auf der web -, die richtig funktioniert, wenn ich zuerst die Herstellung einer einzelnen Gruppe-id :
mydata$id1 <- paste(mydata$id,"000",mydata$day, sep="") ### the single group identifier
myid.uni <- unique(mydata$id1)
a<-length(myid.uni)
last <- c()
for (i in 1:a) {
temp<-subset(mydata, id1==myid.uni[i])
if (dim(temp)[1] > 1) {
last.temp<-temp[dim(temp)[1],]
}
else {
last.temp<-temp
}
last<-rbind(last, last.temp)
}
last
Allerdings gibt es ein paar Probleme mit diesem Ansatz:
1. Ein einzelner Bezeichner erstellt werden muss (was schnell erledigt ist).
2. Es scheint wie eine schwerfällige Stück von code im Vergleich zu der einzigen code-Zeile in Stata.
3. Auf ein mittlerer Datensatz (unter 100.000 Beobachtungen gruppiert in viel zu 6) dieser Ansatz würde etwa 1,5 Stunden.
Gibt es eine effiziente entspricht Stata ist bys var1 var2: keep if _n == 1
?
- Ich bin ein Stata-person, aber ich würde nicht damit rechnen, Charme, R Benutzer hier durch, was impliziert, dass R ist lausig, selbst für eine detaillierte ganz Besondere Aufgabe zu. Besser zu implizieren, dass es eine ordentliche R Weg, es zu tun, nur, dass Sie nicht erkannt.
- Ich wollte nicht zu beleidigen, in Richtung R, wenn es das ist, was es klingt. Ich habe in den Prozess der Migration von Stata für die letzten zwei Wochen und bin immer noch kämpfen, um die grundlegenden Funktionen Recht.
- Für den Anfang bei der migration, während es möglich ist zu verwenden
for
loops effektiv in R, wenn es Ihr erstes resort, ist es vielleicht nicht die effektivste Weg, um zu gehen. - Kein Zweifel; ich bin einfach nur Beratung, wie die Menschen zu beeinflussen und Sie ermutigen, Ihre Frage zu beantworten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bestellen würde ich die
data.frame
an welcher Stelle können Sie Einblick in die Verwendungby
:Alternativ, schau mal in den "Daten.Tabelle" Paket. Weiter mit dem bestellten
data.frame
von oben:Oder, von vorne anfangen, können Sie
data.table
in der folgenden Weise:Und durch die Erweiterung, in der Basis R:
data.frame
ich bin immer ~ 1 minute für die "Daten.Tabelle" - Ansatz, und zwei Minuten fürave
.Paket dplyr macht diese Art von Dinge einfacher.
Dieser Befehl erfordert mehr Speicher in R als in Stata: Zeilen werden nicht unterdrückt, kann eine neue Kopie des Datensatzes erstellt wird.
Mit Daten.Tabelle, vorausgesetzt, die
mydata
Objekt bereits sortiert, in der Weise, die Sie benötigen, ein anderer Ansatz wäre:Mit dplyr mit magrittr Rohre:
Wenn Sie nicht hinzufügen
ungroup()
zu Ende dplyr's Gruppierung Struktur noch vorhanden sein und vielleicht mess up einige der nachfolgenden Funktionen.