【问题标题】:How would I make this R code more concise (using S4 class)?我如何使这个 R 代码更简洁(使用 S4 类)?
【发布时间】:2020-09-14 22:51:22
【问题描述】:

这段代码对我来说似乎是多余的,但我不确定如何使它更简洁?我听说我可以使用将分配 SpecificLikelihoodFactorXXXX 对象的可能性计算器类,但我不知道该怎么做。

 likelihood <- (density*count)/100000000
  
  if (factorA=="Yes") {                 
    likelihood<- likelihood*.35
  } 
  
  if (factorB<30){
    likelihood <- likelihood*1.31   
  }  

  if (factorC>50){
    likelihood <- likelihood*1.9 
  } else if (factorC>25){
    likelihood <- likelihood*1.6 
  } else if (factorC>10){
    likelihood <- likelihood*1.3 
  } else if (factorC==0){
    likelihood<- likelihood
  }
  
  if (factorD=="Yes"){
    likelihood <- likelihood*1.66 
  } 

【问题讨论】:

  • 您不需要 S4。只需摆脱 else 语句,因为它们都没有做任何事情。他们中的许多人只是为自己分配一个变量,并且永远无法达到 factorC > 25 和 factorC > 50 的语句,因为将首先采用 factorC > 10。
  • 这里使用S4是“我是锤子,一切都是钉子”的心态。当然,您可以在此处简化一些代码,但是在此示例代码中,面向对象范式不会启用或简化任何内容。恰恰相反,学习和调试 S4 只是为了改进这段代码需要更长的时间。

标签: r s4


【解决方案1】:

这是一个使用 dplyr 包中的 case_when() 函数的选项。

library(dplyr)

likelihood <- (density*count)/100000000

likelihood <- if_else(factorA == "Yes", likelihood * 0.35, likelihood)
likelihood <- if_else(factorB < 30, likelihood * 1.31, likelihood)

likelihood <- case_when(
  factorC > 50 ~ likelihood * 1.9, 
  factorC > 25 ~ likelihood * 1.6, 
  factorC > 10 ~ likelihood * 1.3, 
  factorC == 0 ~ likelihoodOfHarm
)

likelihood <- if_else(factorD == "Yes", likelihood * 1.66, likelihood)  

注意:我解释了这一行

} else if (factorC==0){
    likelihoodOfHarm <- likelihoodOfHarm
}

是一个错字并将其替换为likelihood &lt;- likelihoodOfHarm。如果不正确,请随时在 case_when() 函数中删除它。

提醒一下,在使事情简洁和使事情难以修改和改变之间取得平衡。

编辑。使用dplyrif_else() 函数而不是基本R 的ifelse()

【讨论】:

  • 如果你使用case_when,你不妨使用if_else,因为它比base R的ifelse更安全。
  • 另一种方式(轻微的代码高尔夫,轻微的可读性)是likelihood * if_else(factorD == "Yes", 1.66, 1)。这可能只是一种偏好,但如果它减少了我必须输入(长)变量名的次数,它就会减少我打错字的可能性(是的,我输入了三遍……我的胖手指)并发现一个错误:-)
  • 我在尝试使用case_when 时遇到此错误:Error: condition must be a logical vector, not a formula object. 有什么建议吗?
  • 这可能是因为我选择了 factorC=1 并且我没有任何小于 10 但大于 0 的东西。我认为这应该可行:factorC &gt;1 ~ likelihood * 1.1
  • @youtube 会发生错误,因为 factorCNA 值或不是数字的值。否则,它应该工作。但是,是的,case_when() 条件无法解释介于 0 和 10 之间的 factorC 值。这将返回一个 NA 值。因此,正如您所指出的,您需要 factorC &gt;1 ~ likelihood * 1.1 或者您可以使用默认值 TRUE ~ likelihood 或与最后一个条件类似的东西。我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2022-11-13
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2022-01-28
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多