我有三个变量;我想创建一个新的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)
答案 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