Kể từ Q này & A là một kết quả tìm kiếm Google phổ biến nhưng câu trả lời là một chút chậm đối với một ma trận lớn và phiên bản @raymkchow chậm bằng NA tôi đề xuất một phiên bản mới sử dụng tìm kiếm theo cấp số nhân và data.table
điện.
Chức năng này tôi đã triển khai trong gói dataPreparation.
đầu tiên xây dựng một data.table dụ, với những đường nét hơn cột (mà thường là trường hợp) và 10% của 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)
Sau đó, điểm chuẩn tất cả các phương pháp:
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
Kết quả như sau:
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
nhanh hơn 10 lần so với o phương pháp tiếp cận.
Cộng với các hàng khác, bạn có nhiều đường liên kết hơn để sử dụng.
Vui lòng đọc nguyên tắc đăng bài và cung cấp mẫu nhỏ, có thể tái sản xuất 'x'. Ngay bây giờ chúng tôi thậm chí không biết nếu 'x' của bạn là số, hãy để một mình một ma trận. Bây giờ, nếu nó là một ma trận, 'y <- x [, sd (x)! = 0]' sẽ đủ. –
Có lẽ không cần thiết nếu bạn đang sử dụng prcomp trên dữ liệu của bạn, nhưng nếu bạn có các loại cột hỗn hợp, một giải pháp đơn giản là 'x [, áp dụng (x, 2, hàm (col) {length (unique (col))> 1 })] ' –