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