2016-05-11 13 views
2

Ich muss eine Beobachtung finden, die einige Kriterien erfüllt und dann diese Indizes mit einem anderen Datensatz zusammenführen. Ich brauche also nicht den Index der Beobachtungen, der die Bedingung erfüllt, sondern den Index, der sich auf alle Beobachtungen bezieht.R bekomme korrekten Index mit der() Bedingung

Zum Beispiel möchte ich die max(x1) gegeben x2>20 finden und dann diesen Index in einem anderen Datensatz später verwenden. Ich brauche den richtigen Index, mit anderen Worten:

dat <- data.frame(name= c("A","B","C","D"), 
      x1= c(1,2,3,4), 
      x2= c(10,20,30,40)) 
dat$name[which.max(dat$x1[dat$x2>20])] 
[1] B 

Ich möchte

[1] D 

das heißt ein Index von 4 zu bekommen, nicht 2.

Antwort

2

Hier ist eine Art und Weise Tabelle mit Daten

library(data.table) 
dat <- as.data.table(dat) 
which(dat[,name]==dat[x2>20,][which.max(x1),name]) 

Kann etwas Ähnliches mit Datenrahmen machen, aber es wird etwas ausführlicher.

which (dat$name==dat$name[which(dat$x2>20)][which.max(dat$x1[which(dat$x2>20)])]) 

Hinweis, daß dieses Verfahren auf der Annahme abhängt, dass Namen eindeutige Werte für jede Zeile enthalten.

+0

Großartig, das hat so funktioniert, wie ich gehofft hatte. Vielen Dank. – 000andy8484

1

Nur max statt which.max verwenden. Der gesamte Datenrahmen muss jedoch basierend auf x1 sortiert werden, da max 1: 1-Mapping durchführt. (Danke @myk_raniu zur Klärung)

dat <- dat[order(dat$x1),] 
dat$name[max(dat$x1[dat$x2>20])] 
#[1] D 
+1

Dies funktioniert nur, weil eine 1: 1-Zuordnung zwischen den Werten des x1-Vektors und den Indizes besteht. x1 = c (1,2,3,4) funktioniert, aber wenn du zu x1 = c (1,2,4,3) wechselst, bricht es ab und gibt dir immer noch D –

+0

OK, ich kann die Antwort so akzeptieren, wie sie funktioniert das Beispiel, das ich zur Verfügung gestellt habe. Hättest du jetzt eine Ahnung, warum in meinem (echten) Fall alle Namen zurückgegeben werden und nicht nur der, der dem Maximum entspricht? Wenn Sie 'dat $ name' ablegen, erhalten Sie einen einzelnen Wert, indem Sie alle Namen hinzufügen. – 000andy8484

+0

@myk_raniu, ja, guter Fang! Vielen Dank. Ich werde überarbeiten – Sotos

1

Der Grund which.max nicht die richtige Antwort nicht geben, dass die gefilterte Liste von x1 ist kürzer als die dat $ Namensliste und es ist nicht mehr ein 1: 1

correspondance

Versuchen Sie stattdessen

dat <- data.frame(name= c("A","B","C","D"), 
        x1= c(1,2,3,4), 
        x2= c(10,20,30,40)) 

dat$name[dat$x1==max(dat$x1[dat$x2>20])] 
+0

Das würde gut funktionieren, dann muss ich 'Join' mit dem Namen als Schlüssel. So wie ich es verstehe, gibt es keine Möglichkeit, den Index, der sich auf den gesamten Beobachtungssatz bezieht, aus der 'which()' Bedingung zurückzugeben. Ich meine, etwas, das den Index "[4]" zurückgibt, anstatt es indirekt durch den Namen zu bekommen? – 000andy8484

+0

aktualisiert mit einer einfacheren Methode, die das tut, was Sie suchen. Sie können die logische Vektorindizierung verwenden, indem Sie WAHR den Wert setzen, der dem Maximum der Bedingung entspricht. –

+1

Diese Methode schlägt fehl, wenn doppelte Werte von x1 vorhanden sind und das gleiche Maximum (x1) in der Teilmenge auch in x1 außerhalb der Teilmenge auftritt. Außerdem gibt es immer noch den Namen und nicht die von OP angeforderte Indexnummer zurück. – dww