就在这里补充几个选项:
如果所有的元素都是相同的,这意味着最小值和最大值将是相同的。请注意,这些是高度优化的内置功能。同样,如果所有元素都是相同的,方差为0。代码:
df[, !sapply(df, function(x) min(x) == max(x))]
df[, !sapply(df, function(x) var(x) == 0)] # if all numeric
如果它是一个性能问题,让我们比较:
# 100 columns and 10000 rows with duplicates:
df <- data.frame(
matrix(rnorm(10000*50),ncol=50), # 50 columns, non-repeating
matrix(1:50, ncol=50)[rep(1,10000),] # 50 columns, identical elements
)
ak <- function(){
Filter(function(x) length(unique(x))>1, df)
}
ak2 <- function(){
df[sapply(df, function(x) length(unique(x)))>1]
}
ak3 <- function(){
df[!sapply(df, anyDuplicated)]
}
cj <- function(){
df[, !sapply(df, function(x) var(x) == 0)]
}
cj2 <- function(){
df[, !sapply(df, function(x) min(x) == max(x))]
}
library(microbenchmark)
microbenchmark(ak(), ak2(), ak3(), cj(), cj2())
Unit: milliseconds
expr min lq mean median uq max neval
ak() 17.472319 17.870399 19.586547 19.040228 19.762838 66.545086 100
ak2() 17.412296 18.152165 19.830981 19.127153 19.908074 65.856221 100
ak3() 11.359604 11.608405 12.475312 11.939775 12.966077 18.132573 100
cj() 6.799404 7.043694 7.466027 7.175871 7.472253 10.451793 100
cj2() 4.068508 4.237848 4.306551 4.279522 4.373600 4.901368 100
内置的min
和max
功能是所谓高优化,这说明了良好的性能。考虑到所涉及的许多计算(计算平均值,从所有元素中减去平均值,平方和,求和),我几乎感到惊讶var == 0
做得很好。
@Henrik其实,我本可以应用它。但我正在学习。不好意思,朋友。发现非常难以理解这种安乐,乐于和运用概念。 – Sid29