有没有办法从 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的数据行

有没有办法从时间戳类型列中获取 DateTime 值?

异常:数据中的列数与范围内的列数不匹配

如何一次性检测和删除熊猫数据帧每一列的异常值? [复制]

R语言之缺失值和异常值处理

从 PowerBI 表的列中删除“%”符号