2016-04-19 8 views
2

を適用するには、私は上記の行の最初のoccuring 2番目に大きな値の列名を格納するDF戻る最初COLNAMESを使用して、データフレームの列で2番目に大きな値を発生&

> editor 
      A B C D E F G H I J 
User1  1 0 5 6 5 6 5 6 2 6 
User2  0 5 4 6 4 5 5 1 7 5 

を持って考えてみましょう。 期待される結果

> editor 
      A B C D E F G H I J 2nd_highest 
User1  1 0 5 6 5 6 5 6 2 6  C 
User2  0 5 4 6 4 5 5 1 7 5  D 

私はedited$2nd_highest <- colnames(edited)[apply(edited, 1, which.max)+1]を試みたが、did'ntはうまくいきました。

アイデア?

答えて

3

ここにアイデアがあります。まず、各行の値をuniqueにソートし、2番目の値を抽出します。 decreasing = TRUEを指定するので、2番目の値は2番目に高い値になります。次に、新しいリストの各要素の最初の値を列名のインデックスとして使用します。

ind_lst <- apply(df, 1, function(i) which(i == sort(unique(i), decreasing = TRUE)[2])) 
df$highest.two <- names(df)[unlist(lapply(ind_lst, '[', 1))] 
df 
#  A B C D E F G H I J highest.two 
#User1 1 0 5 6 5 6 5 6 2 6   C 
#User2 0 5 4 6 4 5 5 1 7 5   D 
+0

何をしたか説明していただけますか? –

+0

はい、申し訳ありません、私は奇妙な結果を得ていましたので、私は二重チェックしていました。 – Sotos

+1

ああ...ありがとう@ダビッド。 'T'が眉をひそめていることを知りませんでした:) – Sotos

2

これはあなたを助けることができます。

mat <- matrix(sample(1:8, 24, replace=TRUE), ncol=6) 
mat 
sec_highest <- apply(mat, 1, function(x) which(x == max(x[which(x != max(x))]))) 
LETTERS[sec_highest] # letters display 

注意あなたが同じスコアを持つ2つの二highestsを持っている場合、一つだけが表示されること。

+0

ここで行ったことを説明してください。 –

+0

[3行目] - 行の最大要素と一致する要素のインデックス(つまり、列番号)を検索します(max要素を削除した後に2番目に高い要素)。 次に、 'colnames(mat)[sec_highest]'(これは私の例ではNULLになります)を使って、あなたの例で表示した文字の列を作成します。 –

6

代数をベクトル化して行操作を避けるために代数を使ってこれを達成しようとしています(まだapplyに似た行列変換を行いますが)。ここでの考え方は、最大値を見つけてデータセットから減らし、次にlog(-1を掛けた後)に変換し、最大値が-Inf(最小値を意味する)になり、次に1/resultにすることです左の値のうち最大の値を見つけます。

indx <- max.col(1/log((editor - editor[cbind(1:nrow(editor), 
       max.col(editor))]) * -1), ties.method = "first") 
names(editor)[indx] 
# [1] "C" "D" 
+1

私は二倍の 'max.col'が十分に効率的でなければならないと思います。これは次のようになります:(1) 'mat = as.matrix(editor)' '後で' matrix'に2回変換するのを避けるために '' mat [mat == mat [cbind(seq_len(nrow(mat)データの性質( '' Inf''は本質的に '' double '')と(3) '' colnames( '' colnames'')を保持するためにmax.col(mat、 "first"))]] = minマックス)[max.col(mat、 "first")] '各行の" max "を削除した後の2番目の' max.col'。 –

+1

@alexis_laz私は実際にあなたのすべての点について考えました。最初の点について - (あなたはすでにこれを私のことと思っていましたが)私はあまりにも怠惰でした。他の2点については、元のデータセットを変更せずにこれを実行しようとしていました。私は一般的にあなたの提案が好きです。 –

関連する問題