【问题标题】:min for each row in a data frame数据框中每一行的最小值
【发布时间】:2016-04-13 12:01:41
【问题描述】:

我尝试计算数据框中多列(逐行min)的最小值,但min 函数会自动返回整个每一列的最小值,而不是单独返回每一行的最小值。我确定我在这里遗漏了一些非常简单的东西?任何想法都非常感谢。

x <- c(1,2,7)
y <- c(1,5,4)
minIwant <- c(1,2,4)
df <- data.frame(x, y, minIwant)
df$minIget <- min(df$x,df$y)
df
  x y minIwant minIget
1 1 1        1       1
2 2 5        2       1
3 7 4        4       1

【问题讨论】:

  • @RichScriven's 不太直观(对我而言),但对于处于优化模式的任何人来说都更快。

标签: r max min


【解决方案1】:

您可以使用apply 遍历每一行

apply(df, 1, FUN = min)

其中1 表示将FUN 应用于df 的每一行,2 表示将FUN 应用于列。

要删除缺失值,请使用:

apply(df, 1, FUN = min, na.rm = TRUE)

【讨论】:

  • 非常感谢。如果我有一个大数据框,我该如何指定应用 FUN 的哪些列?
  • 与您通常按列进行子集化的方式相同,例如apply(df[, c(1, 3, 5)], ...).
  • 这个 1 到底是什么意思??
  • @user9191983 正如我所说,1 表示适用于每一行。如果您想应用于列,您将使用 2!
  • @JASC: apply(df, 1, FUN=min, na.rm=TRUE) 应该可以工作
【解决方案2】:

我们也可以使用library(matrixStats)中的rowMins

library(matrixStats)
df$minIwant <- rowMins(as.matrix(df))

【讨论】:

    【解决方案3】:

    只是想补充一下如何使用 dplyr 来做到这一点。

    library(dplyr)
    
    x<-c(1,2,7)
    y<-c(1,5,4)
    df <- data.frame(x,y)
    
    df %>% rowwise() %>% mutate(minIget = min(x, y))
    # A tibble: 3 x 3
        x     y   minIget
      <dbl> <dbl>   <dbl>
    1    1.    1.      1.
    2    2.    5.      2.
    3    7.    4.      4.
    

    【讨论】:

    • df %&gt;% mutate(minIget = pmin(x, y)) 可能性能更高。
    • dplyr 的 rowwise()pmin() 之间的差异在我的应用程序中很重要:rowwise() 运行了 21.5 秒,pmin() 运行了 0.5 秒。
    【解决方案4】:

    我们可以使用pmin,它可以找到一组值的平行最小值。由于我们的df 在技术上是一个列表,我们需要通过do.call 运行它。

    df$min <- do.call(pmin, df)
    

    给了

    df
    #   x y min
    # 1 1 1   1
    # 2 2 5   2
    # 3 7 4   4
    

    数据:

    df <- data.frame(x = c(1, 2, 7), y = c(1, 5, 4))
    

    另外,如果需要na.rm = TRUE,可以这样做

    df$min <- do.call(pmin, c(df, na.rm = TRUE))
    

    【讨论】:

    • 这很好,但不适用于 NA。我怎样才能使用 na.rm = TRUE?
    • @JASC - 你可以做do.call(pmin, c(df, na.rm = TRUE))。有关如何在 args 参数中使用列表的信息,请参阅 help(do.call)
    猜你喜欢
    • 2020-12-23
    • 2015-05-30
    • 2019-07-19
    • 2021-08-30
    • 2021-04-06
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多