R 满足特定条件时更改列值
我有一个问题,我正在思考一段时间,无法找到解决办法R 满足特定条件时更改列值,r,dataframe,if-statement,dplyr,R,Dataframe,If Statement,Dplyr,我有一个问题,我正在思考一段时间,无法找到解决办法 让我们考虑一些人工数据帧,它是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) qua
让我们考虑一些人工数据帧,它是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)
这个代码直观上非常简单-我们只需使用quants\u s
更改低于quants\u s
的所有值,以及使用quants\u b
更改大于quants\u 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.
你能帮我解决这个问题/指出另一个解决方案吗?我认为用
pmin
和pmax
的“夹紧”方法应该很容易解决这个问题
从预先计算限值开始:
quants我认为这应该通过“夹紧”方法中的pmin
和pmax
轻松解决
从预先计算限值开始:
quants也许我遗漏了一些微妙的东西,但这里有一个使用dplyr的直接方法:
library(dplyr)
x %>%
mutate(across(everything(), ~case_when(. > quantile(.,0.9) ~ quantile(.,0.9),
. < quantile(.,0.1) ~ quantile(.,0.1),
TRUE ~ .)))
库(dplyr)
x%>%
变异(当(.>分位数(,0.9)~分位数(,0.9)时,跨越(一切(),~case_),
.<分位数(,0.1)~分位数(,0.1),
对~))
在这里我们可以看到效果:
x %>%
mutate(across(everything(), ~case_when(. > quantile(.,0.9) ~ "High",
. < quantile(.,0.1) ~ "Low",
TRUE ~ ""),.names = "{.col}Δ")) %>%
mutate(across(!contains("Δ"),~case_when(. > quantile(.,0.9) ~ quantile(.,0.9),
. < quantile(.,0.1) ~ quantile(.,0.1),
TRUE ~ .))) %>%
select(sort(tidyselect::peek_vars())) %>%
head(n=15)
# Exp ExpΔ Norm NormΔ Unif UnifΔ
#1 0.7350033 1.37095845 0.88511769
#2 0.2718374 -0.56469817 0.51711106
#3 1.6570686 0.36312841 0.85193098
#4 0.9729376 0.63286260 0.44279627
#5 0.9210097 0.40426832 0.15788010
#6 2.4238688 -0.10612452 0.44232464
#7 2.5315087 High 1.37297365 High 0.88512802 High
#8 1.5920526 -0.09465904 0.48458793
#9 0.3064365 1.37297365 High 0.25245844
#10 0.2982843 -0.06271410 0.25968998
#11 1.2682549 1.30486965 0.54201594
#12 1.5215655 1.37297365 High 0.64987584
#13 0.8123740 -1.21172411 Low 0.33641913
#14 0.1296444 -0.27878877 0.08499473 Low
#15 0.2484241 -0.13332134 0.45131085
x%>%
变异(当(.>quantile(,0.9)~“High”,
.<分位数(,0.1)~“低”,
TRUE~“”),.names=“{.col}Δ”))%>%
突变(跨越(!contains(“Δ”),~case_,当(.>分位数(,0.9)~分位数(,0.9),
.<分位数(,0.1)~分位数(,0.1),
正确~))%%>%
选择(排序(tidyselect::peek_vars())%>%
水头(n=15)
#Exp ExpΔNorm NormΔUnif UnifΔ
#1 0.7350033 1.37095845 0.88511769
#2 0.2718374 -0.56469817 0.51711106
#3 1.6570686 0.36312841 0.85193098
#4 0.9729376 0.63286260 0.44279627
#5 0.9210097 0.40426832 0.15788010
#6 2.4238688 -0.10612452 0.44232464
#7 2.5315087偏高1.37297365偏高0.88512802偏高
#8 1.5920526 -0.09465904 0.48458793
#9 0.3064365 1.37297365高0.25245844
#10 0.2982843 -0.06271410 0.25968998
#11 1.2682549 1.30486965 0.54201594
#12 1.5215655 1.37297365高0.64987584
#13 0.8123740-1.21172411低0.33641913
#14 0.1296444-0.27878877 0.08499473低
#15 0.2484241 -0.13332134 0.45131085
也许我遗漏了一些微妙的东西,但这里有一个直接的方法使用dplyr
:
library(dplyr)
x %>%
mutate(across(everything(), ~case_when(. > quantile(.,0.9) ~ quantile(.,0.9),
. < quantile(.,0.1) ~ quantile(.,0.1),
TRUE ~ .)))
库(dplyr)
x%>%
变异(当(.>分位数(,0.9)~分位数(,0.9)时,跨越(一切(),~case_),
.<分位数(,0.1)~分位数(,0.1),
对~))
在这里我们可以看到效果:
x %>%
mutate(across(everything(), ~case_when(. > quantile(.,0.9) ~ "High",
. < quantile(.,0.1) ~ "Low",
TRUE ~ ""),.names = "{.col}Δ")) %>%
mutate(across(!contains("Δ"),~case_when(. > quantile(.,0.9) ~ quantile(.,0.9),
. < quantile(.,0.1) ~ quantile(.,0.1),
TRUE ~ .))) %>%
select(sort(tidyselect::peek_vars())) %>%
head(n=15)
# Exp ExpΔ Norm NormΔ Unif UnifΔ
#1 0.7350033 1.37095845 0.88511769
#2 0.2718374 -0.56469817 0.51711106
#3 1.6570686 0.36312841 0.85193098
#4 0.9729376 0.63286260 0.44279627
#5 0.9210097 0.40426832 0.15788010
#6 2.4238688 -0.10612452 0.44232464
#7 2.5315087 High 1.37297365 High 0.88512802 High
#8 1.5920526 -0.09465904 0.48458793
#9 0.3064365 1.37297365 High 0.25245844
#10 0.2982843 -0.06271410 0.25968998
#11 1.2682549 1.30486965 0.54201594
#12 1.5215655 1.37297365 High 0.64987584
#13 0.8123740 -1.21172411 Low 0.33641913
#14 0.1296444 -0.27878877 0.08499473 Low
#15 0.2484241 -0.13332134 0.45131085
x%>%
变异(当(.>quantile(,0.9)~“High”,
.<分位数(,0.1)~“低”,
TRUE~“”),.names=“{.col}Δ”))%>%
突变(跨越(!contains(“Δ”),~case_,当(.>分位数(,0.9)~分位数(,0.9),
.<分位数(,0.1)~分位数(,0.1),
正确~))%%>%
选择(排序(tidyselect::peek_vars())%>%
水头(n=15)
#Exp ExpΔNorm NormΔUnif UnifΔ
#1 0.7350033 1.37095845 0.88511769
#2 0.2718374 -0.56469817 0.51711106
#3 1.6570686 0.36312841 0.85193098
#4 0.9729376 0.63286260 0.44279627
#5 0.9210097 0.40426832 0.15788010
#6 2.4238688 -0.10612452 0.44232464
#7 2.5315087偏高1.37297365偏高0.88512802偏高
#8 1.5920526 -0.09465904 0.48458793
#9 0.3064365 1.37297365高0.25245844
#10 0.2982843 -0.06271410 0.25968998
#11 1.2682549 1.30486965 0.54201594
#12 1.5215655 1.37297365高0.64987584
#13 0.8123740-1.21172411低0.33641913
#14 0.1296444-0.27878877 0.08499473低
#15 0.2484241 -0.13332134 0.45131085
一个选项是
library(dplyr)
x %>%
mutate(across(everything(), ~ifelse(. > quantile(., 0.9), quantile(., 0.9),
ifelse(
. < quantile(., 0.1), quantile(., 0.1),
.))))
库(dplyr)
x%>%
变异(跨越(everything(),~ifelse(.>分位数(,0.9),分位数(,0.9),
如果有(
.<分位数(,0.1),分位数(,0.1),
.))))
一个选项是
library(dplyr)
x %>%
mutate(across(everything(), ~ifelse(. > quantile(., 0.9), quantile(., 0.9),
ifelse(
. < quantile(., 0.1), quantile(., 0.1),
.))))
库(dplyr)
x%>%
变异(跨越(everything(),~ifelse(.>分位数(,0.9),分位数(,0.9),
如果有(
.<分位数(,0.1),分位数(,0.1),
.))))
我不理解同时更改的问题。例如,如果一个数字低于0.1-ile,那么不管我们如何处理另一个值(可能高于或不高于0.9-ile),当第二个操作完成时,这个数字仍然低于0.1-ile。我不理解同时更改的问题。例如,如果一个数字低于0.1-ile,那么无论我们如何处理另一个值(可能高于或不高于0.9-ile),当第二个操作完成时,这个数字仍然低于0.1-ile。