2017-08-31 6 views
0

100列以上10000行以上あるデータフレームがあります。その列のすべての行が同じである場合は、手動で各列のデータをチェックし、それを削除することは難しい作業になっています。R - データフレームが同じである場合、そのデータフレームから列を削除します

私はデータフレームを入力として受け取り、同じではない列のみを持つ別のデータフレームを出力する関数を探しています。

data<- read.table(text = " 
A B C D 
1 1 3 4 
1 2 2 4", header = TRUE) 

と私は、出力データフレームになりたい::

B C 
1 3 
2 2 

おかげ

入力データ・フレームは、何かのようになります。

+0

@Henrik実際、私はそれを適用できました。しかし、私は一緒に学習しています。申し訳ありません、仲間。このサプリーを理解することは非常に難しいと感じて、塗りつぶしてコンセプトを適用してください。 – Sid29

答えて

3

sapplyを使用して各列を調べます。次に、各列に対して、すべての要素が最初の要素と等しいかどうかを確認します。 microbenchmark

data[!sapply(data, function(x) all(x == x[1]))] 
# B C 
#1 1 3 
#2 2 2 

結果を以下に示します。この場合db()

db = function(){ 
    df[!sapply(df, function(x) all(x == x[1]))] 
} 

他のすべての関数であることに注意してくださいとのデータがcoffeinjunky's answerからです。

with(microbenchmark(db(), ak(), ak2(), ak3(), cj(), cj2()), 
    boxplot(x = split(time/1e6, expr), outline = FALSE, ylab = "milliseconds")) 

enter image description here

4

1つのオプションは、1

Filter(function(x) length(unique(x))>1, data) 
# B C 
#1 1 3 
#2 2 2 

それとも別のオプションsapply

data[sapply(data, function(x) length(unique(x)))>1] 

それともanyDuplicated

であるより大きいその unique要素の lengthを持っている列のみを維持するために Filterだろう
data[!sapply(data, anyDuplicated)] 
4

だけでは、ここではいくつかのオプションを追加します。

をすべての要素が同一である場合、これは最小値を意味し、最大値が同じになります。これらは高度に最適化された組み込み関数であることに注意してください。すべての要素が同一である場合も同様に、分散はコード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は、(平均を計算し、すべての要素から平均を減算し、結果を二乗する、合計)多くの計算を考慮すると、うまくいったことに、ほとんど驚いています。

関連する問題