有没有办法从 R 的列中取出异常值?
Posted
技术标签:
【中文标题】有没有办法从 R 的列中取出异常值?【英文标题】:Is there a way to get outliers out of a column in R? 【发布时间】:2022-01-09 15:30:57 【问题描述】:我正在尝试从我的 R 数据集中的一列数据中删除异常值,但我的教授给我的代码一直给我带来问题。当我运行它时,它会为每一列中的所有观察结果返回 NA。
这是代码行:
MainData <- MainData[MainData$GDP_2006 < mean(MainData$GDP_2006) + sd(MainData$GDP_2006)*2, ]
任何建议或解决方案将不胜感激!
【问题讨论】:
您的数据中是否存在缺失值? 代码是直接来自你的脚本还是来自你的教授? 【参考方案1】:我强烈怀疑您遇到了由缺少数据造成的问题。执行TRUE %in% is.na(MainData$GDP_2006)
——如果有缺失值,它会返回一个TRUE
。
有两种方法可以解决这个问题 - 首先过滤掉缺少数据的观察结果,或者将 na.rm=TRUE
添加到您的 mean()
和 sd()
调用中。这似乎重现了您的问题:
# Create demo data
df1 <- mtcars
df1[1, "mpg"] <- NA
# Problem:
df1[df1$mpg < mean(df1$mpg) + sd(df1$mpg) * 2, ]
关于如何完成这项任务,有三种一般的思想流派——base R、tidyverse 和 data.table。它们在这里 - 我个人的偏好是 data.table,但 tidyverse 非常受欢迎。
# Base R way ===========================================================
# Solution 1 (use na.rm):
df1[df1$mpg < mean(df1$mpg, na.rm=TRUE) + sd(df1$mpg, na.rm=TRUE) * 2, ]
# Solution 2 (filter out NAs first):
df1 <- df1[!is.na(df1$mpg),]
df1[df1$mpg < mean(df1$mpg) + sd(df1$mpg) * 2, ]
# Tidyverse way ========================================================
# Set up:
library(dplyr)
# Solution 1 (use na.rm):
df1 %>%
filter(mpg < mean(mpg, na.rm = TRUE) + sd(mpg, na.rm = TRUE)*2)
# Solution 2 (filter out NAs first):
df1 %>%
filter(!is.na(mpg)) %>%
filter(mpg < mean(mpg) + sd(mpg)*2)
# Data.table way =======================================================
# Set up:
library(data.table)
setDT(df1, keep.rownames = TRUE)
# Solution 1 (use na.rm):
df1[mpg < mean(mpg, na.rm=TRUE) + sd(mpg, na.rm=TRUE) * 2]
# Solution 2 (filter out NAs first):
df1[!is.na(mpg)][mpg < mean(mpg) + sd(mpg) * 2]
【讨论】:
以上是关于有没有办法从 R 的列中取出异常值?的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用isna函数查看列表和dataframe中是否包含缺失值将dataframe中数据列中的异常值标注为缺失值NA使用na.omit函数删除dataframe中包含缺失值NA的数据行