如何用boxplot()$ out创建的向量在R中用NA替换异常值

时间:2019-03-05 00:07:29

标签: r

我想知道如何用R中的“ NA”替换异常值,假设这些异常值存储在由boxplot()$ out创建的向量中。

例如:

# create a data frame
df <- data.frame(Group = c("Group1", "Group1", "Group2", "Group2", "Group3", "Group3", "Group4", "Group4", "Group5", "Group5"), 
                 Value1 = c(48, 2, -130, 62, 3, 2, 8, 120, 2, 4), 
                 Value2 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
> df
    Group Value1 Value2
1  Group1     48      1
2  Group1      2      2
3  Group2   -130      3
4  Group2     62      4
5  Group3      3      5
6  Group3      2      6
7  Group4      8      7
8  Group4    120      8
9  Group5      2      9
10 Group5      4     10

# plot the data frame
boxplot(df$Value1)

# create a vector of outliers for the numeric factor
outliers <- boxplot(df$Value1, plot = FALSE)$out

# view outliers
outliers
[1] -130  120

我已按照here on RPubs中列出的说明进行了深入研究。 现在,我想用“ NA”代替异常值,而不是完全删除它们所在的行,这样我就可以将数据保留在与其他列中的异常值相对应的行中,而其他列在各自因数上都不是异常值(即3和Value2中的8)。我假设which%in%会在这里某个地方玩,但是我被卡住了。

我需要知道如何用NA 替换这些值,以便以后可以聚合来自不同列中同一行的数据(以及来自同一列中不同行的数据)。 / p>

我想用NA替换异常值,以便数据框看起来像这样:

> df
    Group Value1 Value2
1  Group1     48      1
2  Group1      2      2
3  Group2     NA      3
4  Group2     62      4
5  Group3      3      5
6  Group3      2      6
7  Group4      8      7
8  Group4     NA      8
9  Group5      2      9
10 Group5      4     10

我在R语言编程方面相对较新。

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为添加一个新列来指示这些值是否是异常值(1)或不是(0)而不是替换值。

一种基本的R方法:

df$is_outlier <- ifelse(df$Value1 %in% boxplot.stats(df$Value1)$out, 1, 0)

结果:

    Group Value1 Value2 is_outlier
1  Group1     48      1          0
2  Group1      2      2          0
3  Group2   -130      3          1
4  Group2     62      4          0
5  Group3      3      5          0
6  Group3      2      6          0
7  Group4      8      7          0
8  Group4    120      8          1
9  Group5      2      9          0
10 Group5      4     10          0

答案 1 :(得分:0)

我相信我已经使用基本R解决方案解决了这个问题。

# Replace the values with NA
df[df$Value1 %in% outliers, "Value1"] = "NA"

这将存储在outliers向量中的异常值替换为NA。但是,它还将列更改为character对象。我需要将其更改回数字。

# Change column back to `numeric`
df$Value1 <- as.numeric(df$Value1)

Voila。问题解决了。