亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

小唯快跑啊 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 關注
  • 1291 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號