2017-05-17 18 views
0

私は通常、作業のためにデータフレームを使用していますが、最近は速度目的でDatatablesのハングアップを取得しようとしています。いくつかの最近のファイルには非常に便利です。とにかくR:列の分散に応じてデータテーブルの列を選択する方法は?

、私は既にそれを読んだ後、列分散を計算し、私のデータフレームから削除するために使用する機能を持っている。

rm_invariant_cols = function(df) { 

    df = df[, sapply(df, function(x) length(unique(x))>1)] ## takes cols with one unique value and drops 
    return(df) 

} 

dfがデータテーブルであるとき、どのように私はこれを達成することができますか?私がデータテーブルで同じ関数を実行すると、カラム自体ではなく各カラムの論理集合が得られます。

NB。私はビネットを読んだが、これはこれをカバーしていないようだ。

おかげで、

ジョン

答えて

3

あなたはwith=FALSEを使用することができます。

dt <- data.table(A = 1:3, B = c(1,1,1), C = c(2,1,3), D = c(2,2,2)) 

dt 
# A B C D 
#1: 1 1 2 2 
#2: 2 1 1 2 
#3: 3 1 3 2 

dt[, sapply(dt, uniqueN) > 1, with=FALSE] 
# A C 
#1: 1 2 
#2: 2 1 
#3: 3 3 

それとも@thelatemailにより示唆されるように、より慣用的な方法:

dt[, .SD, .SDcols=lapply(dt, uniqueN) > 1] 

# A C 
#1: 1 2 
#2: 2 1 
#3: 3 3 
+0

greateのアイデア@thelatemail。それは問題に対処するための慣用的な方法のように見えます。 – Psidom

+0

ソリューションをありがとう。構文はいろいろな点で依然として困惑していますが、問題を解決しました。 –

+0

PSをコメントとして使用して、私は 'uniqueN'に' microbenchmark'を使用していましたが、もっと単純な 'length(unique(x))'バージョンを使用していましたが、BTWでは 'length(unique()') –

関連する問題