想象一下数据帧:
set.seed(1234)
data<-data.frame(id = sample(letters, 26, replace = FALSE),
a = sample(1:10,26,replace=T),
b = sample(1:10,26,replace=T),
c = sample(1:10,26,replace=T))
Run Code Online (Sandbox Code Playgroud)
我想为每个保留id最大值所在的列名.
我正在寻找的结果是一个尺寸为26 x 2的数据框,其中列为for id列largest_value_var.将largest_value_var要包含下面 a,b或c.
到目前为止,我已经能够使用以下方法提取与最大值关联的变量名称:
apply(data[,-1], 1, function(x) c(names(x))[which.max(x)])
Run Code Online (Sandbox Code Playgroud)
但我似乎无法将我想要的结果变成数据帧...任何帮助都表示赞赏.
你可以很容易地做到这一点max.col().设置ties.method = "first"(感谢akrun),我们将在平局的情况下得到第一列.这是一个数据表方法:
library(data.table)
setDT(data)[, names(.SD)[max.col(.SD, "first")], by = id]
Run Code Online (Sandbox Code Playgroud)
更新:在基础R中实现时,这种方法似乎更有效,可能是因为as.matrix()转换max.col().所以这是在基地完成它的一种方法.
cbind(data[1], largest = names(data)[-1][max.col(data[-1], "first")])
Run Code Online (Sandbox Code Playgroud)
感谢Ananda Mahto指出效率差异.