1. ホーム
  2. r

[解決済み] 各行について、最大値の列名を返す。

2022-07-19 16:33:25

質問

従業員の名簿があるのですが、どの部署にいることが多いかを知りたいのです。部門名に対して従業員IDを集計するのは簡単ですが、頻度表から、名簿のカウント数ではなく部門名を返すのは厄介です。以下に簡単な例を示します(列名=部署、行名=従業員ID)。

DF <- matrix(sample(1:9,9),ncol=3,nrow=3)
DF <- as.data.frame.matrix(DF)
> DF
  V1 V2 V3
1  2  7  9
2  8  3  6
3  1  5  4

さて、どうすれば

> DF2
  RE
1 V3
2 V1
3 V2

どのように解決するのですか?

あなたのデータを使う方法もあります(今後の参考のために set.seed() を使った例を作るには sample を使用した例を再現可能にするため)。

DF <- data.frame(V1=c(2,8,1),V2=c(7,3,5),V3=c(9,6,4))

colnames(DF)[apply(DF,1,which.max)]
[1] "V3" "V1" "V2"

を使うよりも速い解決策です。 apply を使うより早いかもしれません。 max.col :

colnames(DF)[max.col(DF,ties.method="first")]
#[1] "V3" "V1" "V2"

...ここで ties.method のいずれかになります。 "random" "first" または "last"

これはもちろん、最大値と等しい2つの列がたまたまあった場合に問題を引き起こします。いくつかの行で複数の結果を得ることになるので、そのような場合に何をしたいのかよくわかりません。例えば

DF <- data.frame(V1=c(2,8,1),V2=c(7,3,5),V3=c(7,6,4))
apply(DF,1,function(x) which(x==max(x)))

[[1]]
V2 V3 
 2  3 

[[2]]
V1 
 1 

[[3]]
V2 
 2