我不确定此问题是否在之前被问过,但我已经搜索过,并没有找到相同的
我有一个数据集:
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
请提供动态答案,因为列数很大
答案 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