【发布时间】:2021-06-26 16:51:46
【问题描述】:
我有一个问题,我想了一段时间,但无法找出解决方案。
让我们考虑一些人工数据框,它是 0.9 和 0.1 分位数:
set.seed(42)
x = data.frame("Norm" = rnorm(100),
"Unif" = runif(100),
"Exp" = rexp(100))
quants_b <- apply(x, 2, quantile, 0.90)
quants_s <- apply(x, 2, quantile, 0.10)
我想要在这个数据框中做的是检查哪些值大于其对应的分位数 0.9 和小于相应的分位数 0.1,并将所有这些值更改为限制。
简单来说:
我想检查哪些值超过 0.9 分位数,所有这些值都转换为 0.9 分位数
我想对 0.1 分位数做同样的事情。
问题的麻烦
在我看来,这个问题乍一看很简单,但是它有一个陷阱——我们必须同时进行转换,因为如果我们先改变上限,然后再降低,转换分位数之间可以改变。
(请注意,我们要将第一个变量替换为quants_s 和quants_b 的元素,第二个替换为第二个,依此类推)。
我的想法
我的第一个想法是在其中使用 dplyr 包和函数 mutate_all。
x %>% dplyr::mutate_all(
function(x) {
ifelse(sweep(x, 2,STATS=quants_s, `<`), quants_s,
ifelse(sweep(x, 2,STATS=quants_b, `>`),
quants_b, x)
)
}
)
这个代码直观上非常简单——我们只需将所有小于quants_s的值更改为quants_s,将大于quants_b的值更改为quants_b。其余数据保持不变。
但是我收到了错误,我不知道如何省略它:
Error: Problem with `mutate()` input `Norm`.
x 'dims' cannot be of length 0
i Input `Norm` is `(function (x) ...`.
Run `rlang::last_error()` to see where the error occurred.
您能帮我解决问题/指出另一个解决方案吗?
【问题讨论】:
-
我不明白同时更改的问题。例如,如果一个数字低于 0.1-ile,那么无论我们如何处理另一个值(可能高于或不高于 0.9-ile),当第二次操作完成时,这个数字就是 仍然低于0.1-ile。
标签: r dataframe if-statement dplyr