替换R中整个数据集中的异常值(基于Tukey和分类变量的每个级别)

替换R中整个数据集中的异常值(基于Tukey和分类变量的每个级别),r,outliers,R,Outliers,如何检测基于分类变量的所有数据集(所有连续列)的异常值,并用NA替换它们。我想使用Tukey技术,但重点是分类变量的每个级别。例如,根据mtcars$am的每个级别,将mtcars[,-c(8,9)]的异常值替换为NA 或者,我如何修改此代码以适用于am的每个级别中的所有变量 lapply(mtcars, function(x){sort(outlier_values<- boxplot.stats(x)$out)}) lappy(mtcars,函数(x){sort(离群值)} 编辑:如

如何检测基于分类变量的所有数据集(所有连续列)的异常值,并用NA替换它们。我想使用Tukey技术,但重点是分类变量的每个级别。例如,根据
mtcars$am的每个级别,将
mtcars[,-c(8,9)]
的异常值替换为NA 或者,我如何修改此代码以适用于am的每个级别中的所有变量

lapply(mtcars, function(x){sort(outlier_values<- boxplot.stats(x)$out)})
lappy(mtcars,函数(x){sort(离群值)}
编辑:如注释中所述,异常值现在为1.5*IQR

这会将am列中每个组的qsec列中的异常值替换为NA。这是通过首先构造一个名为limits的数据帧来实现的,该数据帧包含每个am组的下限和上限。然后,该数据帧与原始数据帧连接,并过滤异常值

library(dplyr)


limits = data.frame(am = unique(mtcars$am))
limits$lower = lapply(limits$am, function(x) quantile(mtcars$qsec[mtcars$am==x],0.25) - 1.5 * (quantile(mtcars$qsec[mtcars$am==x],0.75)- quantile(mtcars$qsec[mtcars$am==x],0.25)) )
limits$upper = lapply(limits$am, function(x) quantile(mtcars$qsec[mtcars$am==x],0.75) + 1.5 * (quantile(mtcars$qsec[mtcars$am==x],0.75)- quantile(mtcars$qsec[mtcars$am==x],0.25)) )

df = mtcars %>% left_join(limits)
df$qsec = ifelse(df$qsec< df$lower | df$qsec>df$upper,NA,df$qsec) 
df = df %>% select(-upper,-lower)
库(dplyr)
限制=数据帧(am=唯一(mtcars$am))
限值$lower=lapply(限值$am,函数(x)分位数(mtcars$qsec[mtcars$am==x],0.25)-1.5*(分位数(mtcars$qsec[mtcars$am==x],0.75)-分位数(mtcars$qsec[mtcars$am==x],0.25)))
限值$upper=lapply(限值$am,函数(x)分位数(mtcars$qsec[mtcars$am==x],0.75)+1.5*(分位数(mtcars$qsec[mtcars$am==x],0.75)-分位数(mtcars$qsec[mtcars$am==x],0.25))
df=mtcars%>%左联合(限制)
df$qsec=ifelse(df$qsecdf$lower,NA,df$qsec)
df=df%>%选择(-upper,-lower)
a参数可用于确定什么比例被视为异常值

编辑:如注释中所述,异常值现在为1.5*IQR

这会将am列中每个组的qsec列中的异常值替换为NA。这是通过首先构造一个名为limits的数据帧来实现的,该数据帧包含每个am组的下限和上限。然后,该数据帧与原始数据帧连接,并过滤异常值

library(dplyr)


limits = data.frame(am = unique(mtcars$am))
limits$lower = lapply(limits$am, function(x) quantile(mtcars$qsec[mtcars$am==x],0.25) - 1.5 * (quantile(mtcars$qsec[mtcars$am==x],0.75)- quantile(mtcars$qsec[mtcars$am==x],0.25)) )
limits$upper = lapply(limits$am, function(x) quantile(mtcars$qsec[mtcars$am==x],0.75) + 1.5 * (quantile(mtcars$qsec[mtcars$am==x],0.75)- quantile(mtcars$qsec[mtcars$am==x],0.25)) )

df = mtcars %>% left_join(limits)
df$qsec = ifelse(df$qsec< df$lower | df$qsec>df$upper,NA,df$qsec) 
df = df %>% select(-upper,-lower)
库(dplyr)
限制=数据帧(am=唯一(mtcars$am))
限值$lower=lapply(限值$am,函数(x)分位数(mtcars$qsec[mtcars$am==x],0.25)-1.5*(分位数(mtcars$qsec[mtcars$am==x],0.75)-分位数(mtcars$qsec[mtcars$am==x],0.25)))
限值$upper=lapply(限值$am,函数(x)分位数(mtcars$qsec[mtcars$am==x],0.75)+1.5*(分位数(mtcars$qsec[mtcars$am==x],0.75)-分位数(mtcars$qsec[mtcars$am==x],0.25))
df=mtcars%>%左联合(限制)
df$qsec=ifelse(df$qsecdf$lower,NA,df$qsec)
df=df%>%选择(-upper,-lower)

a参数可用于确定什么比例被视为离群值。

非常感谢,我有一个问题,我想根据Tukey 1.5*IQR为每列和分类变量的每一级查找离群值。1.我如何修改代码以将其更改为1.5*IQR。如何修改代码以查找Tukey离群值在我的真实数据集中,我有19列,我想用NA替换每列的Tukey异常值。修改Question以使用1.5*IQR。你可以很容易地编写一个覆盖所有列的for循环。让我知道你是否能够这样做。如果你觉得我的答案有用,你能接受吗?Thanks!非常感谢,当然,我会接受你的解决方案。只有两个问题。我是R的新手,所以我想知道如何修改你的代码以处理缺少的观察,因为我有太多缺少的观察。还有关于让循环函数对所有列都起作用的建议。请参阅此处:处理缺少的值(完整的cases语句将有所帮助)。可以像for(col in colnames(df)){function here}一样构造for循环。在我引用$qsec的任何地方,你都应该指向[col]。希望这会有所帮助!@Florian Maas,你的意思是,(col in colnames(mtcars)){limits=data.frame(am=unique(mtcars$am))limits$lower=lappy(limits$am,function(x)quantile(mtcars$col[mtcars$am==x],0.25)-1.5*(分位数(mtcars$col[mtcars$am==x],0.75)-分位数(mtcars$col[mtcars$am==x],0.25)))限值$upper=lapply(限值$am,函数(x)分位数(mtcars$col[mtcars$am==x],0.75)+1.5*(分位数(mtcars$col[mtcars$am==x],0.75)-分位数(mtcars$col[mtcars$am==x],0.25%)>左限值)df$col=ifelse(df$coldf$upper,NA,df$col)df=df%>%select(-upper,-lower)}非常感谢,我有一个问题,我想找到基于Tukey 1.5*IQR的离群值,每个列与分类变量的每个级别。1.我如何修改您的代码以将其更改为1.5*IQR。我还想知道如何修改您的代码以找到每个列的Tukey离群值并用NA替换它。在我的实际数据集中,我有19列,我想要to将每列的Tukey异常值替换为NA。将Question修改为使用1.5*IQR。您可以轻松编写一个覆盖所有列的for循环。如果您能够这样做,请告诉我。如果您发现我的答案有帮助,请接受它。谢谢!非常感谢,当然,我会接受您的解决方案。只有两个问题。我是新的我n R所以我想知道如何修改您的代码以处理缺失的观察,因为我有太多缺失的观察。还有关于让循环函数为所有列工作的建议。请参阅此处:处理缺失值(完整的cases语句将有所帮助)。for循环可以像for(colnames(df)中的col)一样构造{function here}在我提到$qsec的任何地方,你都应该指向[col]。希望这有帮助!@Florian Maas,你的意思是,(col in colnames(mtcars)){limits=data.frame(am=unique(mtcars$am))limits$lower=lappy(limits$am,function(x)quantile(mtcars$col[mtcars$am==x],0.25)-1.5*(分位数(mtcars$col[mtcars$col$col[mtcars$am==x],0.75)-分位数(mtcars$col)[mtcars$am==x],0.25])限值$upper=lapply(限值$am,函数(x)分位数(mtcars$col[mtcars$am==x],0.75)+1.5*(分位数(分位数(mtcars$col[mtcars$am==x],0.75)-分位数(mtcars$col[mtcars$am==x],0.25])df=mtcars%>%左联合(限值)df$col=ifelse