在行级别进行子设置,但值必须是列名称

gh0*_*r18 5 r

想象一下数据帧:

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 idlargest_value_var.将largest_value_var要包含下面 a,bc.

到目前为止,我已经能够使用以下方法提取与最大值关联的变量名称:

apply(data[,-1], 1, function(x) c(names(x))[which.max(x)])
Run Code Online (Sandbox Code Playgroud)

但我似乎无法将我想要的结果变成数据帧...任何帮助都表示赞赏.

Ric*_*ven 7

你可以很容易地做到这一点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指出效率差异.