排名前两个最高值,并获得他们的列名称

时间:2016-10-06 11:01:30

标签: r

我不确定此问题是否在之前被问过,但我已经搜索过,并没有找到相同的

我有一个数据集:

X24_TT  X35_FTT X55_FTT X80_FTT
0.09    0.87    0.89    0.15
0.94    0.12    0.09    0.92
0.89    0.11    0.86    0.08
0.12    0.8     0.15    0.18
0.08    0.09    0.15    0.88

我想按照以下方式对列进行排名并获得前2个最高值及其列名:

X24_TT  X35_FTT X55_FTT X80_FTT Rank 1  Col1    Rank2   Col2
0.09    0.87    0.89    0.15    0.89    X55_FTT 0.87    X35_FTT
0.94    0.12    0.09    0.92    0.94    X24_TT  0.92    X80_FTT
0.89    0.11    0.86    0.08    0.89    X24_TT  0.86    X55_FTT
0.12    0.8     0.15    0.18    0.8     X35_FTT 0.18    X80_FTT
0.08    0.09    0.15    0.88    0.88    X80_FTT 0.15    X55_FTT

请提供动态答案,因为列数很大

2 个答案:

答案 0 :(得分:0)

library(dplyr)
library(reshape2)
df <- data.frame(x = 1:10, y=1:10)

step1 <- df %>% gather() %>% group_by(key) %>% arrange(desc(value)) %>%
  filter(row_number(key) < 3) %>% mutate(rown = row_number(key))

dcast(step1, key ~ rown, mean )

获取每列的前2个值。

正如您在评论中提到的那样,您希望它在每行的原始数据框中。

library(tidyr)
library(reshape2)
df <- data.frame(id = 1:10, x = rnorm(10), y=rnorm(10), z=rnorm(10))

step1 <- df %>% gather(keep = -id) %>% group_by(id) %>% arrange(desc(value)) %>%
  filter(row_number(id) < 3) %>% mutate(rown = row_number(id))

merge(merge(df,step1[step1$rown == 1,], by = "id")
      ,step1[step1$rown == 2,], by = "id")

答案 1 :(得分:0)

我们可以这样做:

c <- ncol(df)
r <- t(apply(df,1, function(x) {
       a <- sort(x,partial=c-1)[c(c,c-1)];
       c(Rank1=a[1], Col1=names(df)[which(x==a[1])], Rank2=a[2], Col2=names(df)[which(x==a[2])])
}))
cbind(df, r)

  # X24_TT X35_FTT X55_FTT X80_FTT Rank1    Col1 Rank2    Col2
# 1   0.09    0.87    0.89    0.15  0.89 X55_FTT  0.87 X35_FTT
# 2   0.94    0.12    0.09    0.92  0.94  X24_TT  0.92 X80_FTT
# 3   0.89    0.11    0.86    0.08  0.89  X24_TT  0.86 X55_FTT
# 4   0.12    0.80    0.15    0.18   0.8 X35_FTT  0.18 X80_FTT
# 5   0.08    0.09    0.15    0.88  0.88 X80_FTT  0.15 X55_FTT

partial的{​​{1}}参数在这里是有益的,因为它不会对整个向量进行排序。

数据

sort