1

在 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))
4

1 回答 1

2

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

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
于 2022-02-08T11:27:47.207 回答