使用
data.table 包,我会按照以下方式处理:
library(data.table)
setDT(cc)[, `:=` (rn = 1:.N, wm = which.max(rowMeans(.SD))), a][rn==wm]
setDT(cc)[, wm := frank(1/rowMeans(.SD), ties.method="first"), a][wm==1]
这将会得到:
a X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 wm rn
1: 1 13.946254 7.302729 9.406389 8.924367 8.129423 10.174735 6.547805 11.618872 12.84100 9.494790 3 3
2: 2 13.606555 12.798149 11.261258 12.991822 12.875935 11.199411 8.551149 10.377451 13.63219 13.643163 2 2
3: 3 6.820769 13.748507 11.630297 11.559873 6.196406 8.925419 11.230415 10.584249 10.41442 6.821673 1 1
4: 4 8.418767 10.673998 6.693021 11.101287 7.855519 9.106210 12.279536 6.925023 6.92334 10.279204 1 1
5: 5 11.529072 7.940031 10.746172 8.535466 13.703122 12.294424 11.362498 11.256843 13.95535 13.264835 1 1
在基本的 R 语言中,您可以这样做:
cc$rm <- apply(cc[,-1], 1, mean)
cc$wm <- ave(cc$rm, cc$a, FUN = function(x) max(x)==x)
cc[cc$wm == 1,]
这将会给出:
a X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 rm wm
3 1 13.946254 7.302729 9.406389 8.924367 8.129423 10.174735 6.547805 11.618872 12.84100 9.494790 9.838637 1
6 2 13.606555 12.798149 11.261258 12.991822 12.875935 11.199411 8.551149 10.377451 13.63219 13.643163 12.093708 1
7 3 6.820769 13.748507 11.630297 11.559873 6.196406 8.925419 11.230415 10.584249 10.41442 6.821673 9.793203 1
9 4 8.418767 10.673998 6.693021 11.101287 7.855519 9.106210 12.279536 6.925023 6.92334 10.279204 9.025591 1
10 5 11.529072 7.940031 10.746172 8.535466 13.703122 12.294424 11.362498 11.256843 13.95535 13.264835 11.458781 1
作为回应您的评论:作为替代方案,您可以在
ave
函数内使用
rank
函数:
cc <- rbind(cc,cc[3,])
cc$wm2 <- ave(cc$rm, cc$a, FUN = function(x) rank(-x, ties.method = "first"))
cc[cc$wm2 == 1,]
这将会给出:
a X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 rm wm wm2
3 1 13.946254 7.302729 9.406389 8.924367 8.129423 10.174735 6.547805 11.618872 12.84100 9.494790 9.838637 1 1
6 2 13.606555 12.798149 11.261258 12.991822 12.875935 11.199411 8.551149 10.377451 13.63219 13.643163 12.093708 1 1
7 3 6.820769 13.748507 11.630297 11.559873 6.196406 8.925419 11.230415 10.584249 10.41442 6.821673 9.793203 1 1
9 4 8.418767 10.673998 6.693021 11.101287 7.855519 9.106210 12.279536 6.925023 6.92334 10.279204 9.025591 1 1
10 5 11.529072 7.940031 10.746172 8.535466 13.703122 12.294424 11.362498 11.256843 13.95535 13.264835 11.458781 1 1
注意:我将数据框重命名为cc
,因为最好不要使用函数名称作为数据框的名称。
by
的使用很好。加一分。 - akrun