为了账号安全,请及时绑定邮箱和手机立即绑定

对于每一行,返回最大值的列名。

对于每一行,返回最大值的列名。

小唯快跑啊 2019-06-15 10:40:28
对于每一行,返回最大值的列名。我有一份员工名册,我需要知道他们最常在哪个部门工作。根据部门名称列出员工ID是很简单的,但是从频次表返回部门名称而不是名册计数要复杂得多。下面是一个简单的示例(列名=部门,行名=雇员ID)。DF <- matrix(sample(1:9,9),ncol=3,nrow=3)DF <- as.data.frame.matrix(DF)> DF   V1 V2 V31  2  7  92  8  3  63  1  5  4现在我怎么才能> DF2   RE1 V32 V13 V2
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

如果你对data.table解决办法,这是一个。这有点棘手,因为您更愿意获得第一个最大值的id。如果你想要最后的最大值,那就容易多了。尽管如此,它并没有那么复杂,而且速度很快!


这里我生成了你们维度的数据(26746*18)。


数据

set.seed(45)

DF <- data.frame(matrix(sample(10, 26746*18, TRUE), ncol=18))

data.table答:

require(data.table)

DT <- data.table(value=unlist(DF, use.names=FALSE), 

            colid = 1:nrow(DF), rowid = rep(names(DF), each=nrow(DF)))

setkey(DT, colid, value)

t1 <- DT[J(unique(colid), DT[J(unique(colid)), value, mult="last"]), rowid, mult="first"]

基准:

# data.table solution

system.time({

DT <- data.table(value=unlist(DF, use.names=FALSE), 

            colid = 1:nrow(DF), rowid = rep(names(DF), each=nrow(DF)))

setkey(DT, colid, value)

t1 <- DT[J(unique(colid), DT[J(unique(colid)), value, mult="last"]), rowid, mult="first"]

})

#   user  system elapsed 

#  0.174   0.029   0.227 


# apply solution from @thelatemail

system.time(t2 <- colnames(DF)[apply(DF,1,which.max)])

#   user  system elapsed 

#  2.322   0.036   2.602 


identical(t1, t2)

# [1] TRUE

这些维度的数据大约快11倍,而且data.table音阶也很好。


编辑:如果任何最大ID都可以,那么:

DT <- data.table(value=unlist(DF, use.names=FALSE), 

            colid = 1:nrow(DF), rowid = rep(names(DF), each=nrow(DF)))

setkey(DT, colid, value)

t1 <- DT[J(unique(colid)), rowid, mult="last"]


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 1111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信