我有三个变量;我想创建一个新变量,显示哪一列的数字最高。数据:
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