【发布时间】:2020-08-19 10:08:00
【问题描述】:
我正在使用 R 中的数据框。我有以下函数删除数据框 df 的所有行,其中,对于指定的列索引/属性,该行的值超出平均值(列)加或减 n*stdev(列)。
remove_outliers <- function(df,attr,n){
outliersgone <- df[df[,attr]<=(mean(df[,attr],na.rm=TRUE)+n*sd(df[,attr],na.rm=TRUE)) & df[,attr]>=(mean(df[,attr],na.rm=TRUE)-n*sd(df[,attr],na.rm=TRUE)),]
return(outliersgone)
}
我的问题分为两部分。
(1) 我的数据框df 也有一个“组”列,它指定了一个类标签。我希望能够根据列内组内的均值和标准差删除异常值,即按因子组织(在列内)。因此,如果在指定的列/属性中,该行的值超出平均值(该列中的 A 组行)加/减 n*stdev(组该列中的一行)。 B、C、D、E、F 等组也是如此。
我该怎么做? (最好只使用基本 R 和 dplyr。)我尝试使用 df %>% group_by(Group) 后跟 mutate 但我不确定要传递什么来变异,因为我的函数 remove_outliers 似乎需要整个数据帧传递给它(因此它可以返回整个数据框,其中仅根据所选属性attr 删除行删除)。
我也愿意听取有关更改函数 remove_outliers 的建议,只要它们还按照说明返回整个数据帧。如果可能的话,我更喜欢避免循环的解决方案(除非不可避免且没有更有效的方法出现在基本 R / dplyr 中)。
(2) 有没有一种直接的方法可以跨多个列结合异常值考虑因素?例如从数据框df 中删除那些在指定的属性/列索引向量(长度≥N)中至少有 $N$ 个属性的异常值行。或更复杂的条件,例如,从数据框df 中删除属性 1 和属性 2、4、6、8 中的至少 2 个异常值的行。
(理想情况下,异常值的定义将再次在列内的组内,如上面问题 1 中所述,但是在不考虑组的情况下仅在列内工作的解决方案对我也很有用。)
【问题讨论】:
标签: r dataframe dplyr filtering outliers