【问题标题】:How to find the indexes of minimum value for each row of a dataframe?如何找到数据帧每一行的最小值索引?
【发布时间】:2021-04-20 21:58:11
【问题描述】:

假设我有一个数据框 df 喜欢

  [,1] [,2] [,3] [,4]
x    1    2    7    1
y    1    5    1    5

我想为df 的每一行找到最小值的索引。我的预期结果是

YES NO NO  NO YES
YES NO YES NO No

我试过了

x <- c(1, 2, 7, 1)
y <- c(1, 5, 1, 5)
df <- rbind(x, y)
apply(df, 1, which.min)

但它不起作用。能否请您详细说明如何操作?

【问题讨论】:

  • 试试t(apply(df, 1, function(x) x == min(x)))
  • 再次感谢@akrun!
  • df[cbind(seq_len(nrow(df)), max.col(-df))] == df

标签: r matrix minimum


【解决方案1】:

我们可以使用apply循环遍历行(MARGIN =1),将行中的元素与行的min进行比较

t(apply(df, 1, function(x) x == min(x)))

-输出

#  [,1]  [,2]  [,3]  [,4]
#x TRUE FALSE FALSE  TRUE
#y TRUE FALSE  TRUE FALSE

或使用来自matrixStatsrowMins 使其紧凑

library(matrixStats)
df == rowMins(df)
#  [,1]  [,2]  [,3]  [,4]
#x TRUE FALSE FALSE  TRUE
#y TRUE FALSE  TRUE FALSE

或者如果我们想坚持使用base R 并使用矢量化选项,那么pmin 是另一种方式(在将matrix 转换为data.frame 之后)

df == do.call(pmin, as.data.frame(df))

【讨论】:

  • 我刚刚在底部看到你的pmin 方法,比我使用Reduce 的版本好多了:)
  • @ThomasIsCoding 没关系。我认为这是一个不错的选择。此外,有些函数在 do.call 中有效,在 Reduce 中无效,反之亦然
  • 我在回答中添加了一条评论,以通过应用do.call来强调您的解决方案的好处
【解决方案2】:

试试

#Code
X==apply(X,1, min)

输出:

X==apply(X,1, min)
    V2    V3    V4    V5
x TRUE FALSE FALSE  TRUE
y TRUE FALSE  TRUE FALSE

使用的一些数据:

#Data
X <- structure(c(1L, 1L, 2L, 5L, 7L, 1L, 1L, 5L), .Dim = c(2L, 4L), .Dimnames = list(
    c("x", "y"), c("V2", "V3", "V4", "V5")))

【讨论】:

    【解决方案3】:

    使用Reduce + pmin 的基本 R 选项(最好使用do.call(而不是Reduce)作为@akrun,当涉及更多列时,从速度的角度来看,Reduce 将慢得多。)

    Reduce(pmin, data.frame(df)) == df
    

    给予

      [,1]  [,2]  [,3]  [,4]
    x TRUE FALSE FALSE  TRUE
    y TRUE FALSE  TRUE FALSE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-23
      • 2020-03-19
      • 2018-01-29
      • 2019-08-21
      • 2017-11-02
      • 2014-09-07
      • 2020-10-11
      • 2017-09-25
      相关资源
      最近更新 更多