Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 满足特定条件时更改列值_R_Dataframe_If Statement_Dplyr - Fatal编程技术网

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。