每行中的最大数量以及更多

use*_*292 3 r

我的数据集包含四个数值变量X1,X2,X3,X_4和一个ID列.

ID <- c(1,2,3,4,5,6,7,8,9,10)
X1 <- c(3,1,1,1,2,1,2,1,3,4)
X2 <- c(1,2,1,3,2,2,4,1,2,4)
X3 <- c(1,1,1,3,2,3,3,2,1,4)
X4 <- c(1,4,1,1,1,4,3,1,4,4)
Mydata <- data.frame(ID, X1,X2,X3,X4)
Run Code Online (Sandbox Code Playgroud)

我需要再创建两列:1)Max,和2)Var

1)最大列:对于每个只有一个最大值的行,我需要在Max变量中保存这个"max"值.如果行有多个,则Max值应为999.

2)Var列:对于只有一个最大值的行,我需要知道它是X1,X2,X3 $还是X4.

对于上面的数据集,这是输出:

ID  X1  X2  X3  X4  Max Var
1   3   1   1   1   3   X1
2   1   2   1   4   4   X4
3   1   1   1   1   999 NA
4   1   3   3   1   999 NA
5   2   2   2   1   999 NA
6   1   2   3   4   4   X4
7   2   4   3   3   4   X2
8   1   1   2   1   2   X3
9   3   2   1   4   4   X4
10  4   4   4   4   999 NA
Run Code Online (Sandbox Code Playgroud)

akr*_*run 7

我们可以使用max.col('Var')获取每行(不包括'ID'列)的最大值'Mydata'的列名,以及每行的最大值pmax('Max').为具有多个最大值('indx')的行创建逻辑索引,并使用它ifelse来获取预期输出.

Var <- names(Mydata[-1])[max.col(Mydata[-1])]
Max <- do.call(pmax,Mydata[-1])
indx <- rowSums(Mydata[-1]==Max)>1

transform(Mydata, Var= ifelse(indx,  NA, Var), Max=ifelse(indx,  999, Max))
Run Code Online (Sandbox Code Playgroud)

  • 我正在考虑应用...只需用apply替换pmax do.call大约慢3倍`microbenchmark({Max < - do.call(pmax,Mydata [-1])},{Max2 = apply(Mydata) [-1],FUN = max,MARGIN = 1)})` (2认同)