के बाद से इस क्यू & एक लोकप्रिय Google खोज परिणाम है, लेकिन इस सवाल का जवाब एक बड़ी मैट्रिक्स के लिए थोड़ा धीमा है और @raymkchow संस्करण NAS के साथ धीमी है मैं घातीय खोज और data.table
शक्ति का उपयोग एक नया संस्करण का प्रस्ताव।
यह एक फ़ंक्शन जिसे मैंने dataPreparation पैकेज में कार्यान्वित किया था।
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
परिणाम:
पहले एक उदाहरण data.table, कॉलम की तुलना में अधिक लाइनों के साथ (जो आमतौर पर है मामले) और 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)
फिर बेंचमार्क का 10% सभी दृष्टिकोण का निर्माण निम्नलिखित हैं:
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 बार ओ की तुलना में तेजी है थर्म दृष्टिकोण
प्लस जितनी अधिक पंक्तियां आपके पास अधिक अंतरंग हैं, इसका उपयोग करना है।
कृपया पोस्टिंग दिशानिर्देश पढ़ें, और एक छोटा, पुनरुत्पादित नमूना 'x' प्रदान करें। अभी हम यह भी नहीं जानते कि आपका 'x' संख्यात्मक है, अकेले मैट्रिक्स दें। अब, यदि यह एक मैट्रिक्स है, 'y <- x [, sd (x)! = 0]' पर्याप्त होगा। –
यदि आप अपने डेटा पर prcomp का उपयोग कर रहे हैं, तो शायद आवश्यक नहीं है, लेकिन यदि आपके पास मिश्रित कॉलम प्रकार हैं, तो एक सरल समाधान 'x [, लागू (x, 2, फ़ंक्शन (कोल) {लंबाई (अद्वितीय (कोला))> 1 })] ' –