2016-04-12 24 views
1

讓我有一個數據幀(DF1)第n個最大的數據幀行的價值及相關列名

DF1:

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

我想找到第n個最大的每一行的值也是該值的列名稱。

敵人示例,假設我想查找每行和相關列名稱的第二大值。所以輸出(DF2)是前人的精力:

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 
相關問題