2017-02-27 1 views
0

Ich versuche, für jede Zeile die Spaltennamen mit den höchsten und zweithöchsten Werten zu identifizieren, wenn sie in der Zeile einen Wert ungleich Null haben. Datenbestand:Spaltenname und Wert der zweithöchsten Werte

DT=data.frame(Row=c(1,2,3,4,5),Price=c(2.1,2.1,2.2,2.3,2.5), 
     '2.0'= c(100,300,700,400,0), 
     '2.1'= c(400,200,100,500,0), 
     '2.2'= c(600,700,200,100,-200), 
     '2.3'= c(300,0,-300,100,100), 
     '2.4'= c(400,0,0,500,600), 
     '2.5'= c(0,200,0,800,-100),check.names=FALSE) 

Das Ziel ist, die die höchste Spaltenwert, der einen beliebigen Wert ungleich Null in es im höchsten Spalte hat, und die Spalte mit dem zweithöchsten Wert, der einen beliebigen Wert ungleich Null hat in es in der zweiten Spalte:

DT=data.frame(Row=c(1,2,3,4,5),Price=c(2.1,2.1,2.2,2.3,2.5), 
     '2.0'= c(100,300,700,400,0), 
     '2.1'= c(400,200,100,500,0), 
     '2.2'= c(600,700,200,100,-200), 
     '2.3'= c(300,0,-300,100,100), 
     '2.4'= c(400,0,0,500,600), 
     '2.5'= c(0,200,0,800,-100),check.names=FALSE, 
     Highest=c(2.4,2.5,2.3,2.5,2.5),Second=c(2.3,2.2,2.3,2.4,2.4)) 

der Code für höchste ist:

DT$Highest <- apply(DT[-1], 1, function(x) max(as.numeric(names(which(x>0|x<0))))) 

Prost

Antwort

2
DT$highest = colnames(DT)[2+apply(DT[,3:8], 1, function(x) 
        which(x != 0 & x == sort(x, decreasing = TRUE)[1])[1])] 
#[1] "2.2" "2.2" "2.0" "2.5" "2.4" 

DT$second_highest = colnames(DT)[2+apply(DT[,3:8], 1, function(x) 
        which(x != 0 & x == sort(x, decreasing = TRUE)[2])[1])] 
#[1] "2.1" "2.0" "2.2" "2.1" "2.3" 
Verwandte Themen