【问题标题】:Get the min of two columns获取两列的最小值
【发布时间】:2014-03-25 12:01:48
【问题描述】:

我想获取最少两列并在同一个 data.frame 中创建一列。我该怎么做?

例如:

ID    Parm1   Parm2
 1      1       2
 2      0       1
 3      2       1
 4      1       0
 5      2       0

期望的输出:

ID    Parm1    Parm2     Min
 1      1        2        1
 2      0        1        0
 3      2        1        1
 4      1        0        0
 5      2        0        0

【问题讨论】:

  • data$Min <- with(data, pmin(Parm1, Parm2))

标签: r dataframe minimum


【解决方案1】:

您希望在函数pmin() 中实现并行最小值。例如使用您的数据:

dat <- read.table(text = "ID    Parm1   Parm2
 1      1       2
 2      0       1
 3      2       1
 4      1       0
 5      2       0", header = TRUE)

您可以使用transform() 将min 列添加为pmin(Parm1, Parm2) 的输出,并在不使用索引的情况下访问dat 的元素:

dat <- transform(dat, min = pmin(Parm1, Parm2))

这给出了:

> dat
  ID Parm1 Parm2 min
1  1     1     2   1
2  2     0     1   0
3  3     2     1   1
4  4     1     0   0
5  5     2     0   0

【讨论】:

  • 和do.call(pmin, dat[-1]),如果您有大量变量并且只想排除第一个ID 变量并保存输入。
  • 谢谢大家的回答^_^
  • 今天我学到了这一点。到目前为止,我一直在使用一些非常低效的方法来做到这一点。非常感谢。
  • 嗨 Gavin,如果我需要 pmin 但忽略 0 怎么办?
【解决方案2】:

以data.table方式:dat [, min := pmin(Parm1, Parm2)]

【讨论】:

    【解决方案3】:

    在 tidyverse 宇宙中,使用dplyr 包:

    library(dplyr)
    
    dat <- read.table(text = "ID    Parm1   Parm2
     1      1       2
     2      0       1
     3      2       1
     4      1       0
     5      2       0", header = TRUE)
    
    dat %>% 
      rowwise() %>%
      mutate(min = min(Parm1, Parm2))
    #> # A tibble: 5 x 4
    #> # Rowwise: 
    #>      ID Parm1 Parm2   min
    #>   <int> <int> <int> <int>
    #> 1     1     1     2     1
    #> 2     2     0     1     0
    #> 3     3     2     1     1
    #> 4     4     1     0     0
    #> 5     5     2     0     0
    

    由reprex package (v0.3.0) 于 2020 年 11 月 15 日创建

    【讨论】:

    • 如果有很多列,并且您只想排除列ID变量,类似于@thelatemail评论中的建议,使用dat %&gt;% rowwise() %&gt;% mutate(min = min(c_across(!ID)))并节省输入。
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2011-12-24
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多