从 R 中的单个单元格中删除离群值
Remove outlier from a single cell in R
我是 R 的新手,我在删除一些异常值时遇到了问题。我有一个像这样的数据框:
Item1 Item2 Item3
4.05 3.9 3.6
12 3.7 4
4.01 3.8 4
我想要的结果应该类似于下面的 table,即 table,其中每一列的异常值都被删除了
Item1 Item2 Item3
4.05 3.9 3.6
NA 3.7 4
4.01 3.8 4
到目前为止,我已经编写了一个可以检测异常值的代码,但我仍然无法删除它们,因为整个列都会发生变化,而不是单个值。
find_outlier <- function(log_reaction_time) {
media <- mean(log_reaction_time)
devst <- sd(log_reaction_time)
result <-which(log_reaction_time < media - 2 * devst | log_reaction_time > media + 2 * devst)
log_reaction_time2 <- ifelse (log_reaction_time %in% result, NA, log_reaction_time)
}
apply(log_reaction_time, 2, find_outlier)
我想问题出在我将函数应用到列 (2) 上,因为我想找到该列的异常值,但随后我只想删除相关值...
不太确定你想要哪个,但这里有一个 tidyverse 解决方案...
library(dplyr)
df %>%
mutate_all(function(x) ifelse(x < mean(x) - 2 * sd(x) | x > mean(x) + 2 * sd(x) ,
NA_real_,
x))
#> # A tibble: 3 x 3
#> Item1 Item2 Item3
#> <dbl> <dbl> <dbl>
#> 1 4.05 3.9 3.6
#> 2 12 3.7 4
#> 3 4.01 3.8 4
media <- mean(as.matrix(df))
devst <- sd(as.matrix(df))
df %>%
mutate_all(function(x) ifelse(x < media - 2 * devst | x > media + 2 * devst ,
NA_real_,
x))
#> # A tibble: 3 x 3
#> Item1 Item2 Item3
#> <dbl> <dbl> <dbl>
#> 1 4.05 3.9 3.6
#> 2 NA 3.7 4
#> 3 4.01 3.8 4
您的数据
library(readr)
df <- read_table("Item1 Item2 Item3
4.05 3.9 3.6
12 3.7 4
4.01 3.8 4")
使用 dplyr
,如果 df
是您 post 中的第一个 data.frame,则以下应该有效:
library(dplyr)
df %>%
mutate(across(everything(), find_outlier)) -> new_df
我们将使用相同的数据集来展示:
#Data
df1 <- structure(list(Item1 = c(4.05, 12, 4.01), Item2 = c(3.9, 3.7,
3.8), Item3 = c(3.6, 4, 4)), class = "data.frame", row.names = c(NA,
-3L))
df1
Item1 Item2 Item3
1 4.05 3.9 3.6
2 12.00 3.7 4.0
3 4.01 3.8 4.0
现在函数:
#Function
find_outlier <- function(log_reaction_time) {
media <- mean(log_reaction_time)
devst <- sd(log_reaction_time)
result <-which(log_reaction_time < media - 2 * devst | log_reaction_time > media + 2 * devst)
log_reaction_time[result] <- NA
return(log_reaction_time)
}
apply(df1, 2, find_outlier)
Item1 Item2 Item3
[1,] 4.05 3.9 3.6
[2,] 12.00 3.7 4.0
[3,] 4.01 3.8 4.0
要突出显示,Item1
的第二个值未设置为 NA
,因为 mean(df1$Item1)=6.69
和 sd(df1$Item1)=4.60
。因此,当条件检查间隔时,您将有 mean(df1$Item1)-2*sd(df1$Item1)=-2.51
和 mean(df1$Item1)+2*sd(df1$Item1)=15.89
,其中 12
不在这些限制内。您将必须定义其他条件来分配它 NA
.
我是 R 的新手,我在删除一些异常值时遇到了问题。我有一个像这样的数据框:
Item1 Item2 Item3
4.05 3.9 3.6
12 3.7 4
4.01 3.8 4
我想要的结果应该类似于下面的 table,即 table,其中每一列的异常值都被删除了
Item1 Item2 Item3
4.05 3.9 3.6
NA 3.7 4
4.01 3.8 4
到目前为止,我已经编写了一个可以检测异常值的代码,但我仍然无法删除它们,因为整个列都会发生变化,而不是单个值。
find_outlier <- function(log_reaction_time) {
media <- mean(log_reaction_time)
devst <- sd(log_reaction_time)
result <-which(log_reaction_time < media - 2 * devst | log_reaction_time > media + 2 * devst)
log_reaction_time2 <- ifelse (log_reaction_time %in% result, NA, log_reaction_time)
}
apply(log_reaction_time, 2, find_outlier)
我想问题出在我将函数应用到列 (2) 上,因为我想找到该列的异常值,但随后我只想删除相关值...
不太确定你想要哪个,但这里有一个 tidyverse 解决方案...
library(dplyr)
df %>%
mutate_all(function(x) ifelse(x < mean(x) - 2 * sd(x) | x > mean(x) + 2 * sd(x) ,
NA_real_,
x))
#> # A tibble: 3 x 3
#> Item1 Item2 Item3
#> <dbl> <dbl> <dbl>
#> 1 4.05 3.9 3.6
#> 2 12 3.7 4
#> 3 4.01 3.8 4
media <- mean(as.matrix(df))
devst <- sd(as.matrix(df))
df %>%
mutate_all(function(x) ifelse(x < media - 2 * devst | x > media + 2 * devst ,
NA_real_,
x))
#> # A tibble: 3 x 3
#> Item1 Item2 Item3
#> <dbl> <dbl> <dbl>
#> 1 4.05 3.9 3.6
#> 2 NA 3.7 4
#> 3 4.01 3.8 4
您的数据
library(readr)
df <- read_table("Item1 Item2 Item3
4.05 3.9 3.6
12 3.7 4
4.01 3.8 4")
使用 dplyr
,如果 df
是您 post 中的第一个 data.frame,则以下应该有效:
library(dplyr)
df %>%
mutate(across(everything(), find_outlier)) -> new_df
我们将使用相同的数据集来展示:
#Data
df1 <- structure(list(Item1 = c(4.05, 12, 4.01), Item2 = c(3.9, 3.7,
3.8), Item3 = c(3.6, 4, 4)), class = "data.frame", row.names = c(NA,
-3L))
df1
Item1 Item2 Item3
1 4.05 3.9 3.6
2 12.00 3.7 4.0
3 4.01 3.8 4.0
现在函数:
#Function
find_outlier <- function(log_reaction_time) {
media <- mean(log_reaction_time)
devst <- sd(log_reaction_time)
result <-which(log_reaction_time < media - 2 * devst | log_reaction_time > media + 2 * devst)
log_reaction_time[result] <- NA
return(log_reaction_time)
}
apply(df1, 2, find_outlier)
Item1 Item2 Item3
[1,] 4.05 3.9 3.6
[2,] 12.00 3.7 4.0
[3,] 4.01 3.8 4.0
要突出显示,Item1
的第二个值未设置为 NA
,因为 mean(df1$Item1)=6.69
和 sd(df1$Item1)=4.60
。因此,当条件检查间隔时,您将有 mean(df1$Item1)-2*sd(df1$Item1)=-2.51
和 mean(df1$Item1)+2*sd(df1$Item1)=15.89
,其中 12
不在这些限制内。您将必须定义其他条件来分配它 NA
.