对于每一行,返回最大值的列名,同时为新组分配关联

时间:2015-10-08 13:41:16

标签: r

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

 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最高为tie

5 = x和z最高为平局

6 = y和z最高为平局

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

我在下面尝试过,但它没有正确处理这种关系。

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

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

 correct= c(1, 2, 3, 4, 5, 6, 7)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

你可以这样做:

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