我有一个双列矩阵,我想生成一个新的矩阵/ data.frame,其中如果最大则Col N为1,否则为0(它们永远不相等)。这是我的尝试:
testM <- matrix(c(1,2,3, 1,1,5), ncol = 2, byrow = T)
>testM
V1 V2
1 1 2
2 3 1
3 1 5
apply(data.frame(testM), 1, function(row) ifelse(max(row[1],row[2]),1,0))
我希望有:
0 1
1 0
0 1
因为max()函数中的0,1参数,但我得到
[1] 1 1 1
有什么想法吗?
答案 0 :(得分:5)
或使用pmax
testM <- matrix(c(1,2,3, 1,1,5), ncol = 2, byrow = T)
--(testM==pmax(testM[,1],testM[,2]))
V1 V2
[1,] 0 1
[2,] 1 0
[3,] 0 1
答案 1 :(得分:4)
您可以使用max.col
和col
生成逻辑矩阵:
res <- col(testM) == max.col(testM)
res
[,1] [,2]
[1,] FALSE TRUE
[2,] TRUE FALSE
[3,] FALSE TRUE
如果你想要它为0/1,你可以这样做:
res <- as.integer(col(testM) == max.col(testM)) # this removes the dimension
dim(res) <- dim(testM) # puts the dimension back
res
[,1] [,2]
[1,] 0 1
[2,] 1 0
[3,] 0 1
答案 2 :(得分:4)
你可以对R中的布尔值进行算术运算!只需检查每行中的元素是否等于它的最大值并乘以1.
t(apply(testM, 1, function(row) 1*(row == max(row))))