2016-05-03 19 views
0

I einen Datenrahmen aufweisen, die einige nicht negative Werte (Art von Rang) hat gegen 3 Variablen a, b und cabsteigender Reihenfolge der varaibles (Spalten), basierend auf in R Ranking

x <- data.frame(cbind(ID=c(1,2,3,4,5),a=c(14,20,0,14,0),b=c(20,0,20,12,0),c=c(12,12,0,0,20))) 

+----------------+ 
|ID | a | b | c | 
+----------------+ 
|1 |14 |20 |12 | 
|2 |20 |0 |12 | 
|3 |0 |20 |0 | 
|4 |14 |12 |0 | 
|5 |0 |0 |20 | 
+----------------+ 

Ich mag würde berechnet eine neue Variable „Priorität“, die die Priorität, in dem angegeben ist, sollten die Variablen

+------------------------+ 
|ID |a |b |c |priority| 
+------------------------+ 
|1 |14|20 |12 |b>a>c | 
|2 |20|0 |12 |a>c  | 
|3 |0 |20 |0 |b  | 
|4 |14|12 |0 |a>b  | 
|5 |0 |0 |20 |c  | 
+------------------------+ 

Jede Hilfe um, wie diese Art der Ausgabe in R zu erzeugen, ist tief geschätzt ausgewählt werden.

Antwort

2

Hier ist ein Versuch, mit einem langen Format zu arbeiten und dann zu dem ursprünglichen Datensatz

library(data.table) 
indx <- melt(setDT(x), 1L)[value > 0, 
      paste(variable[order(-value)], collapse = ">"), 
      by = ID] 
x[indx, priority := i.V1, on = "ID"] 
x 
# ID a b c priority 
# 1: 1 14 20 12 b>a>c 
# 2: 2 20 0 12  a>c 
# 3: 3 0 20 0  b 
# 4: 4 14 12 0  a>b 
# 5: 5 0 0 20  c 

Dieses im Grunde „schmilzt“ die Daten von ID, Filtern von Werten Beitritt zurück größer als Null ist, Aufträge/Pasten Spaltennamen nach den Werten nach IDs

0

Auf diese Weise?

apply(x[-1], 1, function(x) paste(names(x)[x!=0][order(x[x!=0], 
    decreasing = T)], collapse = ">")) 
[1] "b>a>c" "a>c" "b"  "a>b" "c" 
+0

Vielen Dank für die Hilfe .... Dies gibt genau das, was ich wollte und das auch in nur einer Zeile Code. –

+0

@NishantYadav Sie sind herzlich willkommen :-) – DatamineR

0
colLabels=c("a","b","c") 
sorting=function(x){ 
     sortedInd = (sort.int(x, index.return = TRUE, decreasing = TRUE))$ix 
     sortedLabels = colLabels[sortedInd] 
     paste(sortedLabels, collapse = ">") 
} 

x$priority = apply(x[,-1],1,sorting) 

sortedInd gibt die Indizes der einzelnen Zeile sortiert, die dann an colLabels zugeführt wird, die entsprechenden Etiketten zu erhalten. Die Beschriftungen werden dann kombiniert, indem Sie in "Einfügen" als ">" einfügen

Verwandte Themen