Dal momento che questo Q & A è un popolare risultato di ricerca di Google, ma la risposta è un po 'lento per una grande matrice e la versione @raymkchow è lento con AN propongo una nuova versione utilizzando la ricerca esponenziale e data.table
potere.
Questa è una funzione implementata nel pacchetto dataPreparation.
primo costruire un data.table Esempio, con più linee di colonne (che è normalmente il caso) e 10% di AN
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)
Poi benchmark tutti gli approcci:
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
I risultati sono i seguenti:
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
è 10 volte più veloce rispetto al o altri approcci.
Inoltre, più file si hanno e più si interseca.
Leggere le linee guida per la pubblicazione e fornire un piccolo campione riproducibile 'x'. In questo momento non sappiamo nemmeno se il tuo 'x' è numerico, per non parlare di una matrice. Ora, se è una matrice, 'y <- x [, sd (x)! = 0]' sarà sufficiente. –
Probabilmente non è necessario se stai usando prcomp sui tuoi dati, ma se hai tipi di colonne miste, una soluzione semplice è 'x [, applica (x, 2, function (col) {length (unique (col))> 1 })] ' –