【问题标题】:R: use min() within dplyr::mutate()R:在 dplyr::mutate() 中使用 min()
【发布时间】:2015-03-20 04:31:26
【问题描述】:
require(plyr)
require(dplyr)    
set.seed(8)
    df <- 
      data.frame(
        v1 = runif(10, -1,1),
        v2 = runif(10, -1,1))

问题: 作为mutate() 的一部分,我怎样才能将正确的值放入min() 函数中-基本上,我想将v3分配为v1 除以v1v2 中的最小值。 这不起作用:

  df <- 
         df %>% mutate(v3=ifelse(v1 !=0, v1/min(v1,v2), 0))

我想我错过了一些非常简单的东西。

【问题讨论】:

  • 你可以使用pmin,即transform(df, v3=ifelse(v1!=0, v1/do.call(pmin, df), 0))
  • 您在这里加载plyr 包有什么特别的原因吗?我不记得应该先加载哪个,但在这种情况下,您根本不应该加载 plyr
  • df %&gt;% mutate(v3 = (v1 != 0) * v1/pmin(v1,v2)) 怎么样?
  • 这是一种使用do的方式,即。 df %&gt;% rowwise() %&gt;% do(data.frame(., v3=(.$v1!=0)*.$v1/min(.$v1, .$v2)))
  • 您可以使用mutaterowwise - df %&gt;% rowwise %&gt;% mutate(v3 = ifelse(v1 != 0, v1/min(v1, v2), 0))

标签: r min dplyr


【解决方案1】:

来自?min的帮助页面:

pmax 和 pmin 将一个或多个向量(或矩阵)作为参数,并且 返回一个向量,给出“平行”最大值(或最小值) 向量。

另一方面:

max 和 min 返回所有值的最大值或最小值 他们的论点

所以你想在这里使用pmin。使用 dplyr,一个选项 - 如上所述 - 是这样的:

df %>% mutate(v3 = (v1 != 0) * v1/pmin(v1,v2))

这里很好的副作用是您可以避免使用ifelse,而只需与逻辑向量(TRUE / FALSE,然后转换为 1 / 0)相乘。

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 2015-03-20
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多