2017-03-15 5 views
0

Ich muss Zeilen basierend auf zwei Variablen rangieren und ich kann einfach nicht meinen Kopf darum wickeln.Ranking basierend auf zwei Variablen

Testdaten unter:

df <- data.frame(A = c(12,35,55,7,6,NA,NA,NA,NA,NA), B = c(NA,12,25,53,12,2,66,45,69,43)) 

A B 
12 NA 
35 12 
55 25 
7 53 
6 12 
NA 2 
NA 66 
NA 45 
NA 69 
NA 43 

Ich möchte eine dritte Variable berechnen, C, die A, wenn A = NA gleich!. Wenn A == NA, dann C == B, ABER sollte immer der C-Wert folgen, dass eine Reihe mit A == NA niemals eine Reihe mit A! = NA übertreffen sollte.

In den obigen Daten sollte Max (A) gleich max (C) und max (B) nur den sechsthöchsten C-Wert enthalten, da A fünf Nicht-NA-Werte hat. Wenn A == NA und B eine Reihe mit A! = NA übertrifft, dann sollte irgendeine Form der Transformation stattfinden, die sicherstellt, dass die A! = NA-Reihe immer die B-Reihe in der endgültigen C-Punktzahl übertrifft das Ergebnis in etwa so aussehen:

A B C 
55 25 1 
35 12 2 
12 NA 3 
7 53 4 
6 12 5 
NA 69 6 
NA 66 7 
NA 45 8 
NA 43 9 
NA 2 10 

Bisher ist die nächste, die ich bekommen kann, ist

df$C <- ifelse(is.na(df$A), min(df$A, na.rm=T)/df$B, df$A) 

Aber das macht das Ranking den Kopf, wenn A == NA, so B == 2 rangiert 6 anstelle von B == 69

A B C 
55 25 1 
35 12 2 
12 NA 3 
7 53 4 
6 12 5 
NA 2 6 
NA 43 7 
NA 45 8 
NA 66 9 
NA 69 10 

Ich bin mir nicht sicher, ob ich irgendeine Art von Gewichten verwenden könnte?

Alle Vorschläge werden sehr geschätzt! Vielen Dank!

Antwort

0

können Sie versuchen:

df$C <- order(-df$A) 
df[is.na(df$A),"C"] <- sort.list(order(-df[is.na(df$A),"B"]))+length(which(!is.na(df$A))) 

und den Auftrag für C:

df[order(df$C),] 
Verwandte Themen