检索R中列的最大值和第二个最大值的行名

时间:2018-05-24 14:29:19

标签: r

我们有这个df

# We create the df
x <- c(1,33,5,2,56,1)
y <- c(4,358,57,3,32,2)

df <- as.data.frame(cbind(x,y))

rownames(df) <- c("a", "b", "c", "d", "e", "f")

df是:

   x    y
a  1    4
b 33  358
c  5   57
d  2    3
e 56   32
f  1    2

我想从列x中检索最大值及其第二高值的行名,以及y列中的相同行名。

结果将是来自e列的bx以及来自b列的cy

我尝试了这些代码,但没有成功。

rownames(df)[max(df$x)] # for the maximum value
nx <- length(df$x) # length of the x column
rownames(df)[sort(df$x, partial=nx-1)[nx-1]] # for the second max value

但是,前三个代码行的结果是:

NA  # what's wrong?
6   # yeah, it is 6
"e" # nope, the second max is "b"

问题出在哪里?如何解决这些问题?

3 个答案:

答案 0 :(得分:2)

你很接近:只需找到值

rownames(df[df$x == max(df$x),]) # for the maximum value
nx <- length(df$x) # length of the x column
rownames(df[df$x == sort(df$x, partial=nx-1)[nx-1],]) # for the second max value

答案 1 :(得分:2)

我们可以遍历列,order逐渐减少,使用该索引获取rownames,前两个子集

sapply(df, function(x) head(row.names(df)[order(x, decreasing = TRUE)], 2))
#      x   y  
#[1,] "e" "b"
#[2,] "b" "c"

答案 2 :(得分:0)

使用 dplyr::filter 和基本 R quantile 函数的替代方法。

df %>%  
  filter(variable > quantile(.$variable, 0.975, na.rm = T))