对于每一行,返回最大值的列名,同时将连接分配给新组



我有三个变量;我想创建一个新变量,显示哪一列的数字最高。数据:

 x= c(5, 1, 4, 5, 5, 1, 1)
 y= c(1, 2, 4, 5, 1, 4, 1)
 z= c(1, 1, 5, 3, 5, 4, 1)
 data <-data.frame(x, y, z)

重要的是,如果有领带,我希望这也被指出来,这样。

1= x最高

2= y最高

3= z最高

4= x, y为最高

5= x和z作为平局是最高的

6 = y和z作为平局是最高的

7 = x, y和z都同样高。

我在下面试过了,但是它不能正确处理领带。

 data$Highest <- apply(data, 1, which.max)
 data

p。我想从上面的数据中得到的正确的新变量应该是:

 correct= c(1, 2, 3, 4, 5, 6, 7)
fun <- function(v) {
  stopifnot(length(v) == 3L)
  if (anyNA(v)) stop("NA values in input")
  if (length(unique(v)) == 1L) return(7L)
  rk <- rank(v)
  if (max(rk) %% 1 == 0L) return(which.max(rk))
  test <- rk %% 1 != 0L
  if (sum(test) == 2L) return(sum(which(test)) + 1L)
  stop("undefined case")
}
apply(data, 1, fun)
#[1] 1 2 3 4 5 6 7

你可以这样做:

library(plyr)
combn2 <- function(x, y) combn(y, x, paste, collapse="")
x = unlist(sapply(1:ncol(data), combn2, names(data)))
vec = alply(data, 1, function(u) which(paste(names(data)[max(u)==u], collapse='')==x))
#unlist(vec)
#1 2 3 4 5 6 7 

相关内容

最新更新