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倍。