2016-04-12 18 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 
相关问题