【问题标题】:Parallel operation with 'if' condition带有“if”条件的并行操作
【发布时间】:2021-03-11 17:39:35
【问题描述】:

我正在准备自己的函数,这些函数将在相当大的数据库上运行。我可以看到当有内置循环时它们很慢,所以我试图避免它们。到目前为止,我不知道如何避免:
我想准备一个向量,它由其他两个向量组成,其方式取决于它们的组成部分。这是一个例子:

v1 <- 1:11
v2 <- 11:1

v3 <- vector()

for (i in 1:11){

       if(v1[i] < v2[i]){

               v3[i] <- v1[i] + v2[i]

       }else if(v1[i] > v2[i]){

               v3[i] <- v1[i] - v2[i]
       }else{

               v3[i] <- NA

       }

}

你能解释一下如何创建没有循环的 v3 吗?该函数最终将使用更复杂的 if-else 语句(梯形图和内置语句)。
谢谢!

【问题讨论】:

  • 很好奇这里的“相当大”是什么意思。例如,对于 100 万行,您可能需要与 1 亿行不同的方法。
  • 真的!数据不会超过 100 万行。通常为 10 000 - 20 000。最多 200 000 - 300 000 行。

标签: r loops if-statement


【解决方案1】:
v3 <- v1 + ifelse(v1<v2, v2, ifelse(v1>v2, -v2, NA))

[1] 12 12 12 12 12 NA  2  4  6  8 10

或者如果您有多种情况,我认为dplyr::case_when 语法比许多嵌套的 ifelse 更干净。

v3 <- dplyr::case_when(
  v1<v2   ~  v1+v2,
  v1>v2   ~  v1-v2,
  TRUE    ~  NA_integer_    # note dplyr::case_when and dplyr::if_else are
)                           # strict about types and require the output
                            # alternatives to be the same type 

无论哪种方式,这些都是向量化操作,这意味着 R 不需要在每个循环中转换为低级代码,并且应该更高效。

【讨论】:

猜你喜欢
  • 2022-10-21
  • 1970-01-01
  • 2016-01-23
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2011-02-15
相关资源
最近更新 更多