【问题标题】:How to use multiple functions based on a condition using lapply如何使用 lapply 根据条件使用多个功能
【发布时间】:2019-05-02 17:37:02
【问题描述】:

我有一个关于使用条件在 lapply 中使用多个函数的问题。 这是数据框

Data <- data.frame(c(1:6),c(7:12), c(1,0,1,0,1,1), 0)
colnames(Data) <- c("a","b","c","d")

我想根据条件将输出应用于每一行,例如在这种情况下,如果 col c 为 1,我想使用 min 函数,如果 col c 为 0,我想使用 max 函数。

我试过了

Output <- lapply(Data$d, if(Data$c == 1){min(Data$b - Data$c, Data$a)} else 
{max(Data$b - Data$c, Data$a)})

但条件不是基于单个单元格,而是基于整个列,我如何为该特定行中的单元格获取此条件?

谢谢。

【问题讨论】:

    标签: r apply lapply


    【解决方案1】:

    我们可以使用pmin/pmax 向量化并使用ifelse 而不是if/else

    with(Data, ifelse(c == 1, pmin(b - c, a), pmax(b, a)))
    

    请注意,对于“否”表达式,我们不需要b-c,因为列的“c”为 0

    【讨论】:

    • 好的,谢谢。那么,如果我编写自己的函数,我该如何对其进行矢量化呢?我写了一个自定义的上限函数,我想用它来代替 pmin 和 pmax。感谢您的帮助。
    • @Kou pmin/pmax 已经矢量化了。如果你想矢量化你的函数,试试Vectorize(yourfun)
    【解决方案2】:

    我对 R 不是很熟悉,但这些情况通常需要“切换”。当需要评估一个条件和 2 个或更多结果时,转换通常是一种明确的做事方式。

    也许:

    Output <- switch(Data$c, 
    1 = min(Data$b - Data$c, Data$a),
    0 = max(Data$b - Data$c, Data$a))
    

    我喜欢开关,因为它非常清楚发生了什么。另外,如果您需要添加“默认”或更多选项,这非常容易。

    我不能保证那里的代码会起作用,因为我不知道 R,但也许这是朝着正确方向的推动? :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      相关资源
      最近更新 更多