在 R 中,EXCEL 中是否有类似 IFERROR 公式的可用函数

In R , is there any avaiable funcation like IFERROR formula in EXCEL

在 R 中,EXCEL 中是否有类似 IFERROR 公式的可用函数? 我想使用 4 个最接近的数字来计算移动平均线,但如果组中的数字小于 4,则使用正态平均线。 详细参考下面的代码,IF_ERROR只是我想要的功能,不能工作

library(tidyverse)
library(TTR)
test_data <- data.frame(category=c('a','a','a','b','b','b','b','b','b'),
             amount=c(1,2,3,4,5,6,7,8,9))

test_data %>% group_by(category) %>% mutate(avg_amount=IF_ERROR(TTR::runMedian(amount,4),
                                                                median(amount),
                                                                TTR::runMedian(amount,4))

一般来说,输入只应在特殊情况下产生错误。在简单的 if 语句就足够的情况下,捕获和处理错误的计算成本可能很高。这里的关键是意识到如果组大小小于 4,runMedian 会抛出错误。记住我们可以使用 n() 检查 mutate 中的组大小,所以你需要做的就是:

test_data %>% 
  group_by(category) %>% 
  mutate(avg_amount = if(n() > 3) TTR::runMedian(amount, 4) else median(amount))
#> # A tibble: 9 x 3
#> # Groups:   category [2]
#>   category amount avg_amount
#>   <chr>     <dbl>      <dbl>
#> 1 a             1        2  
#> 2 a             2        2  
#> 3 a             3        2  
#> 4 b             4       NA  
#> 5 b             5       NA  
#> 6 b             6       NA  
#> 7 b             7        5.5
#> 8 b             8        6.5
#> 9 b             9        7.5

此外,如果您想替换 运行 中位数开头的 NA 值,您可以使用 ifelse:

test_data %>% 
  group_by(category) %>% 
  mutate(avg_amount = if(n() > 3) TTR::runMedian(amount, 4) else median(amount),
         avg_amount = ifelse(is.na(avg_amount), median(amount), avg_amount))
#> # A tibble: 9 x 3
#> # Groups:   category [2]
#>   category amount avg_amount
#>   <chr>     <dbl>      <dbl>
#> 1 a             1        2  
#> 2 a             2        2  
#> 3 a             3        2  
#> 4 b             4        6.5
#> 5 b             5        6.5
#> 6 b             6        6.5
#> 7 b             7        5.5
#> 8 b             8        6.5
#> 9 b             9        7.5