【问题标题】:for each row, find value under condition对于每一行,找到条件下的值
【发布时间】:2018-10-03 16:18:01
【问题描述】:

从下面的示例中,对于每一行,我试图在“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

【问题讨论】:

  • 另外,如果我想知道最小值的列号,我应该怎么做?
  • 关于列索引,是整个数据集的索引还是'a'和'b'列之间的索引?

标签: r matrix dplyr apply


【解决方案1】:

这是一个选项,将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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多