【问题标题】:if statement in a funcion with dplyr verbs带有 dplyr 动词的函数中的 if 语句
【发布时间】:2018-11-26 11:10:28
【问题描述】:

是否可以这样写:

g <- function(method) {
  dataset %>%
    if (method == 1) {
      mutate(boot1 = some_formula1)
    } else {
      mutate(boot2 = some_formula2)
    }
}

a <- g(1)

或者是在 mutate 中使用 ifelse / if_elsecase_when 的唯一选择?

【问题讨论】:

  • 欢迎来到 SO(你还是 有点 新来的 :-)!通过一个完整但最小的工作示例来了解您真正想要完成的工作会有所帮助。鉴于您提供的信息很少,@Marcel_G 的回答应该会有所帮助,但我不确定我们是否真的知道您要做什么。
  • 您好,是的,我是新来的。我想发布我的功能(全部),但后来认为没有必要。你们现在已经解决了我的问题,但下次我会尝试发布我想要完成的内容。所以我的理解是,不能在管道中间使用 if 语句,我可以在 if 语句之后停止管道并重新启动。
  • 您好,我现在已将所有代码包含在另一个问题中。你能看看吗link

标签: r if-statement dplyr tidyverse


【解决方案1】:

我想是的,也许这会有所帮助。如果我理解得很好,您需要在现有数据集(可能是data.frame)中添加一个新列,方法为条件:

# some fake data
data <- data.frame(a = c(1,3,5))

g <- function(method){
  if (method == 1) {
    data %>% mutate(boot1 = 'some_formula1')} 
  else{
    data %>% mutate(boot1 = 'some_formula2')
                   }
                     }

g(2)
  a         boot1
1 1 some_formula2
2 3 some_formula2
3 5 some_formula2

g(1)
  a         boot1
1 1 some_formula1
2 3 some_formula1
3 5 some_formula1

您也可以将它放在dplyr 链中,如您所说,可能像这样,if_else

method <- 1
data %>% mutate(boot1 = if_else( method == 1,'some_formula1','some_formula2' ))

或者case_when:

data %>% mutate(boot1 = case_when(method == 1 ~ 'some_formula1',
                                  method == 2 ~ 'some_formula2'))

尽管它们看起来更慢,但看看这个(还添加了ifelse):

Unit: microseconds
      expr     min      lq     mean   median       uq      max neval cld
        if 581.548 594.774 636.6556 606.7210 642.9875  980.907   100 a  
   if_else 729.174 747.734 852.2972 772.0545 834.3475 5406.721   100  bc
    ifelse 701.441 716.587 793.0887 743.0400 793.6010 1486.934   100  b 
 case_when 858.454 876.161 931.2391 900.2675 936.5345 1602.134   100   c

【讨论】:

  • 非常感谢!现在答案似乎很明显,我的问题是我不知道什么时候开始传输数据。
  • 您好,我无法在我的函数中实现 if 语句。我有一个新问题link。可以看看吗?
【解决方案2】:

欢迎使用 stackoverflow。是的,可以在函数中使用 dplyr-verbs。这是您想要的功能:

g <- function(method, data){
  if (method == 1) {
    data %<>% mutate(boot1 = "A")} 
  else{
    data %<>% mutate(boot1 = "B")
  }
  return(data)
}

我建议将您提供的数据转换为函数的参数以及方法参数。之后你可以添加任何你想要变异的东西。在我的示例中,g(1, data) 将添加一个名为 boot1 的列,其值为“A”。当然,您可以进行任何其他转换。

【讨论】:

  • 谢谢。似乎 return 语句对代码做了一些事情,所以函数不起作用。
  • 不客气。 “返回”只是将结果打印到控制台。使用 mtcars 和 iris 等多个数据集对我来说效果很好。
  • 你好。我问了另一个问题link。当我尝试实现 if 语句时,该函数不起作用。在我的原始函数中,我将 map2 与 mutate 一起使用,并且如果在管道的中间,我需要 if 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多