2016-04-28 2 views
1

Ich habe einen Datenrahmen wie unten gezeigt.Wie führe ich einen zeilenweisen Vergleich von Zahlen in einem R-Datenrahmen durch

SampleDF <- structure(list(FirstVal = c(100, 230, 450, 600), SecondVal = c(566, 
547, 557, 250), ThirdVal = c(782, 479, 823, 178), LowerLimit = c(10, 
15, 22, 50), UpperLimit = c(600, 500, 600, 500)), .Names = c("FirstVal", 
"SecondVal", "ThirdVal", "LowerLimit", "UpperLimit"), row.names = c(NA, 
4L), class = "data.frame") 

Ich habe Spalten namens FirstVal, SecondVal and ThirdVal und zwei berechnete Spalten UpperLimit and LowerLimit.

Ich versuche, Elemente aus jeder Zeile auszuwählen, die innerhalb der unteren und oberen Grenzen liegen und jedes Element jenseits von UpperLimit verwerfen. Nachdem ich dies beseitigt habe, möchte ich herausfinden, welches Element unter den verbleibenden am größten ist, und es in einer neuen Spalte hinzufügen.

Zusätzlich möchte ich den Spaltennamen mit hinzufügen. Ich habe versucht, dies zu tun, indem ich meinen ursprünglichen Datenrahmen transponierte, aber ich habe Probleme, meine ursprünglichen Spalten zu verweisen.

Wie führe ich zeilenweise Vergleiche in R durch?


Erwartete Ausgabe:

SampleDFNew 
    FirstVal SecondVal ThirdVal LowerLimit UpperLimit MaxValBelowUpperLim ColumnName 
1  100  566  782   10  600     566 SecondVal 
2  230  547  479   15  500     479 ThirdVal 
3  450  557  823   22  600     557 SecondVal 
4  600  250  178   50  500     250 SecondVal 

Antwort

1

Das funktioniert!

1.Erste Werte herausfinden, die nicht in die Grenzen fallen und sie entfernen.

2. Suchen Sie unter anderen Elementen ist max und extrahieren Namen von colnames.

x<-sapply(SampleDF[,1:3],function(x) ifelse(x > SampleDF$LowerLimit & x < SampleDF$UpperLimit,x,NA)) 

SampleDf$Columnname <- colnames(x)[apply(x,1,which.max)] 
+0

Warum wird die folgenden Fehler geben, wenn ich versuche, innerhalb einer Funktion (glänzend reaktive oder eine einfache Funktion), um das obige Verfahren zu benutzen? 'Fehler in Spaltennamen (x_r) [apply (x_r, 1, which.max)]: Ungültiger Indextyp 'list'' – sunitprasad1

2

können Sie versuchen:

tmp<-(SampleDF[,1:3]>=SampleDF$LowerLimit & SampleDF[,1:3]<=SampleDF$UpperLimit)*as.matrix(SampleDF[,1:3]) 
colnames(SampleDF[,1:3])[max.col(tmp*NA^(rowSums(tmp)==0))] 
#[1] "SecondVal" "ThirdVal" "SecondVal" "SecondVal" 
+0

Perfekt !! Aber @koundy hat es zuerst gepostet, also habe ich diese Antwort "angenommen". – sunitprasad1

+2

Kein Problem damit, froh, dass es geholfen hat. Bedenken Sie auch, dass meine Lösung vektorisiert ist und viel schneller sein sollte. – nicola

+0

Ja tatsächlich. Es ist schneller. – sunitprasad1

Verwandte Themen