【问题标题】:Finding rowwise minimum and column index in a tibble在小标题中查找行最小值和列索引
【发布时间】:2021-01-07 09:24:17
【问题描述】:


我有以下小标题:

> df <- tibble(
     ID = LETTERS[1:4],
     a  = c(1,5,9,8),
     b  = c(5,9,8,2),
     c  = c(5,4,5,5)
)

> df
# A tibble: 4 x 4
  ID        a     b     c
  <chr> <dbl> <dbl> <dbl>
1 A         1     5     5
2 B         5     9     4
3 C         9     8     5
4 D         8     2     5
> 

我想要的是获得列a:c 的行最小值以及该最小值的列索引。
输出表应如下所示:

# A tibble: 4 x 6
  ID        a     b     c   Min Col_Index
  <chr> <dbl> <dbl> <dbl> <dbl>     <dbl>
1 A         1     5     5     1         1
2 B         5     9     4     4         3
3 C         9     8     5     5         3
4 D         8     2     5     2         2

我不想使用rowwise()

谢谢!

【问题讨论】:

    标签: r purrr tibble


    【解决方案1】:

    您可以使用pmindo.call 来获得按行的最小值,并将与max.col 一起使用的值取反以获得最小值的列索引。

    library(dplyr)
    library(purrr)
    
    df %>%
      mutate(Min = do.call(pmin, select(., a:c)), 
             Col_Index = max.col(-select(., a:c)))
    
    #  ID        a     b     c   Min Col_Index
    #  <chr> <dbl> <dbl> <dbl> <dbl>     <int>
    #1 A         1     5     5     1         1
    #2 B         5     9     4     4         3
    #3 C         9     8     5     5         3
    #4 D         8     2     5     2         2
    

    使用purrrpmap_dbl

    df %>%
      mutate(Min = pmap_dbl(select(., a:c), ~min(c(...))),
             Col_Index = pmap_dbl(select(., a:c), ~which.min(c(...))))
    

    【讨论】:

    • 是的,您可以使用pmap_dbl。请参阅更新的答案。
    • 非常感谢 Ronak Shah...这就是我一直在寻找的。​​span>
    【解决方案2】:

    一个选项可能是:

    df %>%
     rowwise() %>%
     mutate(min = min(c_across(a:c)),
            min_index = which.min(c_across(a:c)))
    
      ID        a     b     c   min min_index
      <chr> <dbl> <dbl> <dbl> <dbl>     <int>
    1 A         1     5     5     1         1
    2 B         5     9     4     4         3
    3 C         9     8     5     5         3
    4 D         8     2     5     2         2
    

    【讨论】:

      【解决方案3】:

      基础 R 解决方案:

      setNames(cbind(df, t(apply(df[, vapply(df, is.numeric, logical(1))], 1, function(row) {
        cbind(min(row), which.min(row))}))), c(names(df), "min", "col_index"))
      

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 2021-01-13
        • 1970-01-01
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 2015-06-29
        相关资源
        最近更新 更多