だけでは、ここではいくつかのオプションを追加します。
をすべての要素が同一である場合、これは最小値を意味し、最大値が同じになります。これらは高度に最適化された組み込み関数であることに注意してください。すべての要素が同一である場合も同様に、分散はコード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