我有一个数据框(df1)
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 :(得分: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
dplyr
和tidyr
替代方:
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 :(得分: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