2017-03-08 8 views
0

私は、各列から3つのトップ値(注文事項)を選択し、対応する行番号を保存する必要がある大きなデータフレームを持っています。各列からn個のトップ値を選択し、対応する行を保存するにはどうすればよいですか?

names<- c("t1","t10","t11","t2","t3","t4","t5","t6","t7","t8","t9") 
values1 <- c(2,3.1,4.5,5.1,6.5,7.1,8.5,9.11,10.1,11.8,12.3) 
values2 <- c(1,3.1,3,5.1,6.5,7.1,8.5,9.11,10.1,12,12) 

mydf<- data.frame(names,values1,values2) 
#@Juan Bosco has suggested the followings which is great but gets confuses in this case where I have similar values... 
idx <- lapply(2:3, function(col_index) { 
max_values <- sort(mydf[[col_index]], decreasing = T)[1:3] 
sapply(max_values, function(one_value){ 
as.numeric(rownames(mydf[mydf[[col_index]] == one_value, ])) 
}) 
}) 

どのようにこの問題に取り組むことができますか?

おかげ

+0

名前列に「最高値」をどのように定義しますか?残りの部分は数値であるので、 'max'を使うことができます。 –

+0

行番号を追跡できる限り、その列を削除できます。しかし、「max」は単一の値を与えます。私はnトップのものが欲しい。 @Juan Bosco – Jack

答えて

1

は、以下を行名と列数が同じであると仮定すると、降順にsortの結果に直接サブセットを使用して、3つの最高値の行番号を返します。

lapply(2:3, function(col_index) { 
     as.numeric(rownames(mydf[mydf[[col_index]] %in% sort(mydf[[col_index]], decreasing = T)[1:3], ])) 
    }) 

編集:

以前のアプローチは、順不同に行番号を返します。

次のコードに追加すると、最初に高い値から3番目に高い値の行番号が返されます。

lapply(2:3, function(col_index) { 
    max_values <- sort(mydf[[col_index]], decreasing = T)[1:3] 
    sapply(max_values, function(one_value){ 
    as.numeric(rownames(mydf[mydf[[col_index]] == one_value, ])) 
    }) 
}) 

編集2:

前のコードは、タイでうまく対処していません。以下は、ネクタイを扱う方法です。

lapply(2:3, function(col_index) { 
    max_values <- sort(mydf[[col_index]], decreasing = T)[1:3] 
    max_rows <- sapply(max_values, function(one_value){ 
    as.numeric(rownames(mydf[mydf[[col_index]] == one_value, ])) 
    }) 

    unique(unlist(max_rows)) 

}) 

これは新しい問題を紹介し、あなたが行ための3つの値よりも以上で終了することができます。これに対処するための迅速かつ汚れた方法は、最初の3つの関心のある値を選択することです。

unique(unlist(max_rows))[1:3] 
+0

これは動作しますが、現在の行番号ではなく値でソートされた結果が必要です。言い換えれば、私は各列の最初の最高、2番目の最高と3番目の最高をしたい、順序は重要です。 @Juan Bosco – Jack

+0

@Jack行番号を順番に返すような編集を追加しました。 –

+0

ご協力ありがとうございます@Juan Bosco。これは素晴らしいことですが、2つの同じ値があると混乱します! – Jack

関連する問題