2016-10-06 30 views
0

我不知道這個問題是否問過或沒有,但我已搜查,並沒有發現同樣的排名前兩名的最高值,並得到他們的列名

我有一個數據集:

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 

請提供動態答案列數是擁抱e

+0

什麼是您預期的輸出,因爲有兩列秩1和秩2 – akrun

+0

@akrun我預期的輸出是1級,山口1,秩2,col2的 – ROY

+0

請在您的文章 – akrun

回答

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") 
+0

我想將它們添加爲我的數據集中的列 – ROY

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 

sortpartial爭論是有益的在這裏,因爲它不整向量進行排序。

數據

df <- structure(list(X24_TT = c(0.09, 0.94, 0.89, 0.12, 0.08), X35_FTT = c(0.87, 
0.12, 0.11, 0.8, 0.09), X55_FTT = c(0.89, 0.09, 0.86, 0.15, 0.15 
), X80_FTT = c(0.15, 0.92, 0.08, 0.18, 0.88)), .Names = c("X24_TT", 
"X35_FTT", "X55_FTT", "X80_FTT"), class = "data.frame", row.names = c(NA, 
-5L))