4

列ごとの一意の値の合計量をreorder列にする方法は? data.frame例として:

var1 var2 var3
  1    1   1
  0    2   2
  1    3   3
  0    4   1
  1    5   2

これを自動的に並べ替える方法はありvar2, var3, var1ますか (一意の値の長さはそれぞれ 5、3、2、またはその逆の 2 3 5 であるため)。

この場合、必要なものを取得するのはそれほど難しくありませんが、私の場合は多くの列があります。この種の並べ替えを自動的に行う方法はありますか?

また、列名があるかどうかに関係なく、 matrix(に加えて)で機能するソリューションが必要です。data.frame

4

2 に答える 2

7

このようなもの?

df[names(sort(sapply(df, function(x) length(unique(x))), decreasing = TRUE))]

#   var2 var3 var1
# 1    1    1    1
# 2    2    2    0
# 3    3    3    1
# 4    4    1    0
# 5    5    2    1

入力が の場合、次のようmatrixになります。

m[, names(sort(apply(m, 2, function(x) 
       length(unique(x))), decreasing = TRUE))] 

動作するはずです。

#      var2 var3 var1
# [1,]    1    1    1
# [2,]    2    2    0
# [3,]    3    3    1
# [4,]    4    1    0
# [5,]    5    2    1

編集:投稿の例には列名があるようですが、コメントで指定したものにはありません。例を正しく作成してください。

X <- cbind(1, rnorm(10), 1:10)

列名は期待できないため、インデックスを返す必要があります。これを試してください(もちろん、列名があるかどうかに関係なく機能します):

m[, sort(apply(X, 2, function(x) 
         length(unique(x))), decreasing = TRUE, index.return = TRUE)$ix]
于 2013-03-06T11:07:20.637 に答える
5

order、を使用した別のソリューション

dat[,order(apply(dat,2,function(x) length(unique(x))),decreasing = TRUE)]
  var2 var3 var1
1    1    1    1
2    2    2    0
3    3    3    1
4    4    1    0
5    5    2    1

ここで、colnames を削除すると、良い結果が得られますが、警告が表示されます。

 colnames(dat) <- NULL
 dat[,order(apply(dat,2,function(x) length(unique(x))),decreasing = TRUE)]
  NA NA NA
1  1  1  1
2  2  2  0
3  3  3  1
4  4  1  0
5  5  2  1

編集テストのパフォーマンス:

1000列のマトリックスでテストします。2 つの解の時間は同等であり、 のわずかな増加がありorderます。

X <- matrix(rnorm(100*1000),ncol=1000,nrow=100)
Arun <- function() X[, sort(apply(X, 2, function(x) 
  length(unique(x))), decreasing = TRUE, index.return = TRUE)$ix]

AgStudy <- function()  X[,order(apply(X,2,function(x) length(unique(x))),decreasing = TRUE)]

library(microbenchmark)

microbenchmark(Arun(),AgStudy())

Unit: milliseconds
       expr      min       lq   median       uq      max
1 AgStudy() 28.04634 32.37105 34.73820 36.49930 129.6048
2    Arun() 31.15476 32.97180 36.24027 37.91584 132.3871
于 2013-03-06T11:33:13.443 に答える