2016-04-22 4 views
1

Ladebibliothek und Beispieldaten:berechnen oben und niedrigsten zehn Prozent Werte in mehreren Spalten in R

library(MASS) 
View(Cars93) 
Cars93$ID=1:93 

Jetzt möchte ich Cars93, so dass neue df (sub0l und sub0h) der Teilmenge haben alle IDs mit allen Spalten, aber mit nur oben (für df sub0h) und den niedrigsten 10% -Werten (für df sub0l) in Spalte 17:25, und Ruhewerte (11-100 Quartil für df sub0l und 0-90 Quartil für df sub0h) könnten in NA geändert werden.

Hier ist mein Versuch, zwei dfs mit Top-Ten-% oder niedrigsten zehn% Werte von Spalten 17.25 zu erstellen:

sub0l <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x) 
    subset(Cars93, (Cars93[,17:25] <= quantile(Cars93[,17:25], probs= .10))))) 

sub0h <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x) 
    subset(Cars93, (Cars93[,17:25] >= quantile(Cars93[,17:25], probs= .91))))) 

ich einen Fehler, während oben und niedrigsten zehn Quartile der Spalt subseting:

Error in `[.data.frame`(Cars93, ,17:25) : undefined columns selected 
Called from: `[.data.frame`(Cars93, ,17:25) 

Jede bessere Alternative?

Antwort

2

denke ich, gibt folgende Formel, was Sie suchen

sub0l <- cbind(Cars93[,1:16], sapply(Cars93[,17:25], 
        function(i) ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i))) 

sub0h <- cbind(Cars93[,1:16], sapply(Cars93[,17:25], 
       function(i) ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i))) 

Die sapply Funktion Schleifen durch jede Variable in der data.frame, auf die die Quantilsfunktion angewendet wird. Innerhalb jedes Durchlaufs greift die generische Funktion über das Argument "i" auf die Variable als Vektor zu. Dies wird dann an die ifelse-Funktion übergeben. Diese Funktion betrachtet jedes Element des Vektors i und beurteilt, ob es den Test besteht. Wenn das Element den Test besteht, wird ihm NA zugewiesen. Wenn es fehlschlägt, wird der ursprüngliche Wert zurückgegeben. Dieser Prozess eignet sich hervorragend für numerische Variablen.

Wenn einige der Variablen, die nicht numerisch sind, dann können Sie wie unten eine zusätzliche Prüfung in den sapply Funktionen hinzufügen:

sub0l <- cbind(Cars93[,1:16], 
       sapply(Cars93[,17:25], 
       function(i) { 
        if(is.numeric(i)) { 
        ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i))) 
        } 
        else i 
       })) 

sub0h <- cbind(Cars93[,1:16], 
       sapply(Cars93[,17:25], 
       function(i) { 
        if(is.numeric(i)) { 
        ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i) 
        } 
        else i 
       })) 

vor Beginn der oben beschriebenen Operation, die generische Funktion überprüft, ob der Vektor i vom Typ numerisch (in R ist dies entweder der Modus double oder integer, siehe ?typeof für eine Diskussion der Kernelementtypen in R). Wenn dieser Test fehlschlägt, wird der Vektor von else i zurückgegeben. Wenn der erste Test erfolgreich ist, beginnt der oben beschriebene Prozess.

+0

Danke für den Kommentar. Ich erhalte immer noch einen Fehler "Fehler in quantile.default (i, probs = 0.1, na.rm = T): Faktoren sind nicht erlaubt. Abgerufen von: quantile.default (i, probs = 0.1, na.rm = T)" – Rocky

+0

anderer, aber ähnlicher Datensatz – Rocky

+0

Danke; Ja, es gab Faktoren in den Daten. Könnten Sie bitte Ihren Code ein wenig erklären, damit er anderen helfen kann, die diesen Beitrag lesen? Es ist in Ordnung, wenn Sie nicht wollen. Für andere Leser, die ähnliche Probleme haben könnten; Probieren Sie diese Codes aus, bevor Sie den obigen Code mit der Antwort ausführen: 'sapply (df, mode)', 'sapply (df, class)', 'welches (colnames (df) ==" Spaltenname ")' zum Überprüfen von Modus, Klasse und Position der Spalte in df. – Rocky

Verwandte Themen