我想知道如何用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语言编程方面相对较新。
谢谢!
答案 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。问题解决了。