R 如何识别每行具有最大值的N列?

R 如何识别每行具有最大值的N列?,r,dplyr,data.table,R,Dplyr,Data.table,我的数据如下所示: set.seed(122217) df <- data.frame(ID = paste0("id",1:100), A = rnorm(100), E = rnorm(100), I = rnorm(100), O = rnorm(100), U = rnorm(100)) 此代码生成我想要的: > head(ranking) id First Second Third 1: id1 A E I 2: id2 U O

我的数据如下所示:

set.seed(122217)
df <- data.frame(ID = paste0("id",1:100), A = rnorm(100), E = rnorm(100), I = rnorm(100), O = rnorm(100), U = rnorm(100))
此代码生成我想要的:

> head(ranking)
id First Second Third
1: id1     A      E     I
2: id2     U      O     I
3: id3     A      E     I
4: id4     E      U     I
5: id5     I      A     U
6: id6     I      A     U

但不是很优雅。有更干净的方法吗?

使用
应用
解决方案:

 foo <- colnames(df)[-1]
 data.frame(df[, 1], 
            t(apply(df[, -1], 1, function(x) foo[tail(order(x), 3)]))[, 3:1])

foo使用
应用的解决方案

 foo <- colnames(df)[-1]
 data.frame(df[, 1], 
            t(apply(df[, -1], 1, function(x) foo[tail(order(x), 3)]))[, 3:1])

foo使用
数据的解决方案。表

library(data.table)

melt(setDT(df), id = 1)[order(-value)
                        ][, variable[1:3], ID
                          ][, dcast(.SD, ID ~ rowid(ID, prefix = 'p'))]
其中:

与tidyverse实现的逻辑相同:

library(dplyr)
library(tidyr)

df %>% 
  gather(key, value, -1) %>% 
  group_by(ID) %>% 
  arrange(ID, -value) %>% 
  slice(1:3) %>% 
  select(-value) %>% 
  mutate(rn = paste0('p', row_number())) %>% 
  spread(rn, key)

使用数据:

set.seed(122217)
df <- data.frame(ID = sprintf("id%03d",1:100), A = rnorm(100), E = rnorm(100), I = rnorm(100), O = rnorm(100), U = rnorm(100))
set.seed(122217)

df使用
数据的解决方案。表

library(data.table)

melt(setDT(df), id = 1)[order(-value)
                        ][, variable[1:3], ID
                          ][, dcast(.SD, ID ~ rowid(ID, prefix = 'p'))]
其中:

与tidyverse实现的逻辑相同:

library(dplyr)
library(tidyr)

df %>% 
  gather(key, value, -1) %>% 
  group_by(ID) %>% 
  arrange(ID, -value) %>% 
  slice(1:3) %>% 
  select(-value) %>% 
  mutate(rn = paste0('p', row_number())) %>% 
  spread(rn, key)

使用数据:

set.seed(122217)
df <- data.frame(ID = sprintf("id%03d",1:100), A = rnorm(100), E = rnorm(100), I = rnorm(100), O = rnorm(100), U = rnorm(100))
set.seed(122217)

df@arkun-nope。我添加了一个例子来更好地解释我想要什么。你能在你这端运行代码吗?我会犯错误。是来自
数据表的
转置
还是
purr
?代码在我的linux和windows计算机上都运行良好。转置来自
数据。表
对我来说,
t(应用(df[-1],1,FUN=函数(x)名称(x)[order(-x)][1:3])
是compact@arkun不。我添加了一个例子来更好地解释我想要什么。你能在你这端运行代码吗?我会犯错误。是来自
数据表的
转置
还是
purr
?代码在我的linux和windows计算机上都运行良好。转置是来自
数据。表
对我来说,
t(apply(df[-1],1,FUN=函数(x)名称(x)[order(-x)][1:3])
是compact我从这篇文章中发现的rowid,比
tbl[,nS:=1.N,id]快约10倍。
我从这篇文章中发现的rowid,比
tbl[,nS:=1.N,id]快约10倍。