2016-04-12 13 views
1

私は、データフレームを持ってみましょう(DF1)n番目の最大のデータフレーム内の行の値と関連する列名

DF1:私は、各行のn番目の最大値を見つけたい

v1 v2 v3 v4 
-- -- -- -- 
4.1 1.2 12 1.4 
14 18.4 15.1 6.9 

その値の列名も表示されます。

敵の例では、各行の2番目に大きな値と関連する列名を検索したいとします。だから、出力(DF2)があることsould:

DF2:

value col_name 
---  -------- 
4.1  v1 
15.1 v3 

私はRを使用していることをどのように行うことができますか?私はどんな助けも非常にうれしく思います。どうもありがとう。

+0

@ JasonAizkalns、警告ありがとうございます。私はその質問を編集した。 – oercim

+0

あなたはもっと親切な形式でデータを共有してもよろしいですか? 'dput(df1)'は素晴らしいでしょう。 – Gregor

答えて

2

これは荒いですが、仕事を取得します。

second_largest <- apply(df, 1, FUN = function(x) tail(sort(x), 2)[1]) 
cols <- which(df == second_largest, arr.ind = T)[, 2] 

df2 <- data.frame(value = second_largest, 
        col_name = colnames(df)[cols]) 

# df2 
# value col_name 
# 1 4.1  v1 
# 2 15.1  v3 

dplyrtidyr代替:

library(dplyr) 
library(tidyr) 

df %>% 
    mutate(row = row_number()) %>% 
    gather(col, val, -row) %>% 
    group_by(row) %>% 
    arrange(val) %>% 
    top_n(2) %>% 
    do(head(., 1)) 
1

似ていますが、わずかに異なるアプローチ。あなたのデータが大きい場合、これは多少速くなる可能性があります - そうでない場合は、実際の違いは目につきません。

n = 2L 
mat = as.matrix(df1) 
ind = apply(df1, 1, FUN = function(x) which(rank(-x) == n)) 
data.frame(value = mat[cbind(1:nrow(mat), ind)], col_name = colnames(mat)[ind]) 
# value col_name 
# 1 4.1  v1 
# 2 15.1  v3 
関連する問題