从下面的示例中,对于每一行,我试图获取“a”和“b”之间的最小值。
set.seed(1234)
M = matrix(sample(20,20), ncol=4)
M
[,1] [,2] [,3] [,4]
[1,] 3 10 7 9
[2,] 12 1 5 17
[3,] 11 4 20 16
[4,] 18 8 15 19
[5,] 14 6 2 13
colnames(M) = c("a","b","a","b")
这就是我想要的
"a" "b"
[1,] 3 9
[2,] 5 1
[3,] 11 4
[4,] 15 8
[5,] 2 6
最佳答案
这里有一个选项,通过列名称拆分 data.frame
(转换为 data.frame
)并获取 pmin
每行
sapply(split.default(as.data.frame(M), colnames(M)), function(x) do.call(pmin, x))
# a b
#[1,] 3 9
#[2,] 5 1
#[3,] 11 4
#[4,] 15 8
#[5,] 2 6
如果我们需要最小值的列号,则使用 max.col
do.call(cbind, lapply(split.default(as.data.frame(M), colnames(M)),
function(x) data.frame(Min = do.call(pmin, x), index = max.col(-x))))
# a.Min a.index b.Min b.index
#1 3 1 9 2
#2 5 2 1 1
#3 11 1 4 1
#4 15 2 8 1
#5 2 2 6 1
关于r - 对于每一行,查找条件下的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49984132/