Frage

Ich habe einen Datensatz mit 60 Zeilen und 3036 Spalten.Die Zeilenquantile habe ich bereits mit der Funktion berechnet rowQuantiles von dem matrixStats Paket.Daraus habe ich einen Spaltenvektor [60,1] erhalten.Jetzt möchte ich aus jeder Zeile nur die Daten auswählen, die höher als das Zeilenquantil sind.Wenn ich die which-Funktion wie folgt verwende:

datset_qu95 = which(dataset > rowQuantiles(dataset, probs=c(0.95))

dann verliere ich die Datendimensionen und erhalte nur ein Array statt einer Matrix mit den folgenden Dimensionen [60,152].

Kann mir jemand helfen?

Danke schön!

War es hilfreich?

Lösung

Ich glaube nicht, dass eine rowQuantile-Funktion benötigt wird.Wählen Sie einfach die höchsten Werte bis zu einer Wahrscheinlichkeitsschwelle aus:(Anmerkung bearbeiten (erste Version hatte einen falschen Indexausdruck)

> apply( dat, 1, function(x) x[order(x)][1:( (1-0.95)*ncol(dat))])
    obs1     obs2     obs3 
 11.5379 856.3470 136.8860 

Und wie immer, da R-Matrizen spaltenorientiert sind, werden Sie sie wahrscheinlich verwenden wollen t() auf das Ergebnis, um es wieder in die erwartete Zeilenausrichtung zu bringen.

Zu deinem Kommentar:Es wurde ein Fehler behoben, sodass die höchsten statt der niedrigsten Werte erfasst werden:

 apply( dat, 1, function(x)
                  x[order(x, decreasing=TRUE)][1:( (1-0.95)*ncol(dat))])

Andere Tipps

0.05 * 3036 = 151.8 Wenn Sie jedoch in jeder Zeile Werte auswählen, die größer als das 95 %-Quantil sind, bedeutet dies nicht, dass Sie systematisch 152 Werte haben.Wenn Sie die Abmessungen Ihres Objekts beibehalten möchten, können Sie versuchen, unerwünschte Werte durch zu ersetzen NA'S.
Da Ihr Objekt nicht riesig ist, können Sie auch mit Datenrahmenobjekten arbeiten und Ihre Beobachtungen entlang der Zeilendimension durchführen.

library(matrixStats)

# To extract your values...
myfun <- function(k, q){x[k, x[k,] > q]}
x <- matrix(sample(1:100, 60*3036, replace=TRUE), ncol=3036)
xx <- mapply(myfun, seq(along=x[,1]), rowQuantiles(x, probs=.95))
# xx is a list, xx[[1]] contains the values of x[1,] > quantile(x[1, ], .95)

# The number of selected values depends on their distribution - with NORM should be stable
x11() ; par(mfrow=c(2,1))
hist(sample(1:100, 60*3036, replace=TRUE)) # UNIF DISTRIB
n.val <- sapply(xx, length)
hist(n.val, xlab="n.val > q_95%")
abline(v=152, col="red", lwd=5)

# Assuming you want the same number of value for each row
n <- min(n.val)
myfun <- function(x){sample(x, n)} # Representative sample - Ordering is possible but introduce bias. Depends on your goals
xx <- t(sapply(xx, myfun))
dim(xx) # 60 n
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top