Ponieważ Q & A jest popularny wynik wyszukiwania Google, ale odpowiedź jest nieco powolny dla dużej matrycy i wersja @raymkchow jest powolny z agencji krajowych i zaproponować nową wersję stosując wykładniczą wyszukiwanie i data.table
moc. Jest to funkcja, którą zaimplementowałem w pakiecie dataPreparation.
Pierwszy zbudować data.table exemple, z więcej linii niż kolumn (które to zwykle bywa) i 10% NAS
ncol = 1000
nrow = 100000
df <- matrix(sample(1:(ncol*nrow),ncol*nrow,replace = FALSE), ncol = ncol)
df <- apply (df, 2, function(x) {x[sample(c(1:nrow), floor(nrow/10))] <- NA; x}) # Add 10% of NAs
df[,sample(1:ncol,70,replace = FALSE)] <- rep(1,times = nrow) # df is a large matrix
df <- as.data.table(df)
Następnie benchmarku wszystkie podejścia:
time1 <- system.time(df1 <- df[,apply(df, 2, var, na.rm=TRUE) != 0, with = F]) # the first method
time2 <- system.time(df2 <- df[,!apply(df, MARGIN = 2, function(x) max(x, na.rm = TRUE) == min(x, na.rm = TRUE)), with = F]) # raymkchow
time3 <- system.time(df3 <- df[,apply(df, 2, function(col) { length(unique(col)) > 1 }), with = F]) # Keith's method
time4 <- system.time(df4 <- df[,-whichAreConstant(df, verbose=FALSE)]) # My method
Te wyniki są następujące:
time1 # Variance approch
# user system elapsed
# 2.55 1.45 4.07
time2 # Min = max approach
# user system elapsed
# 2.72 1.5 4.22
time3 # length(unique()) approach
# user system elapsed
# 6.7 2.75 9.53
time4 # Exponential search approach
# user system elapsed
# 0.39 0.07 0.45
all.equal(df1, df2)
# [1] TRUE
all.equal(df3, df2)
# [1] TRUE
all.equal(df4, df2)
# [1] TRUE
dataPreparation:whichAreConstant
jest 10 razy większa niż O inne podejścia.
Ponadto im więcej rzędów, tym bardziej interesujące jest ich użycie.
Przeczytaj wskazówki dotyczące publikowania i podaj małą, powtarzalną próbkę "x". W tej chwili nie wiemy nawet, czy twoje "x" jest numeryczne, nie mówiąc już o macierzy. Teraz, jeśli jest to macierz, wystarczy "y <- x [, sd (x)! = 0]". –
Prawdopodobnie nie jest to konieczne, jeśli używasz prcomp na swoich danych, ale jeśli masz mieszane typy kolumn, prostym rozwiązaniem jest 'x [, zastosuj (x, 2, funkcja (col) {length (unique (col))> 1 })] ' –