R:使用列表 trim 离群值
R: Using lists to trim outliers
我有一个包含 11 个数据框的列表,每个数据框都具有 44 个变量的相同结构。其中一个变量是比率,我正在尝试 trim 包含离群值的记录。我已经能够使用以下代码得出上限和下限。
首先,我为每个数据帧创建了一个分位数列表:
quartiles <- lapply(class203_in, function(x) {
quartiles <- quantile(x$mv_ratio, type=6)
})
接下来我爆出第一和第三四分位数:
q1 <- lapply(quartiles, function(x) {
q1 <- x[2]
})
# create list of third quartile
q3 <- lapply(quartiles, function(x) {
q3 <- x[4]
})
然后我计算了IQR:
iqr <- lapply(class203_in, function(x) {
iqr <- IQR(x$mv_ratio, type=6)
})
终于想出了上下界:
lower <- mapply(function(x, y) x - (y * 1.5), q1, iqr)
upper <- mapply(function(x, y) (y * 1.5) + x, q3, iqr)
每个对象的结果如下所示(列表中每个对象的上限具有完全相同的结构和名称):
> lower
$`Yr02.25%`
[1] 0.1885
$`Yr03.25%`
[1] 0.2245
$`Yr04.25%`
[1] 0.2005
$`Yr05.25%`
[1] 0.1795
$`Yr06.25%`
[1] 0.2315
$`Yr07.25%`
[1] 0.127
$`Yr08.25%`
[1] 0.06125
$`Yr09.25%`
[1] 0.0365
$`Yr10.25%`
[1] -0.29725
$`Yr11.25%`
[1] -0.2985
$`Yr12.25%`
[1] -0.1045
我现在正尝试使用这两个列表来 trim 我的主要数据框列表中的异常值,其中 mv_ratio 是我尝试 trim 的变量在。我已经接近了,但我似乎无法让它在列表或其他地方踢出数据框的精确副本。这是让我最接近的代码:
class203_out <- mapply(function(x, y, z) x <- x[which(x$mv_ratio > y &
x$mv_ratio < z),], class203_in, lower, upper)
class203_in是数据帧列表。当我 运行 这个时,我得到一个巨大的矩阵。
任何帮助或推动正确的方向将不胜感激。
因为你只处理一个列表,而且你的问题看起来很简单,我建议使用 doParallel
包来做一个 foreach
(如果你愿意,可以并行化,但默认是顺序)。
我还建议对所有内容使用 data.table
,因为。
library(doParallel)
library(data.table)
subsetted_df_list <- foreach(i = seq(df_list)) %do% {
x <- setDT(df_list[[i]])
q <- quantile(x$mv_ratio, type = 6)
iqr <- IDR(x$mv_ratio, type = 6)
lower <- q[2] - iqr * 1.5
upper <- q[4] + iqr * 1.5
x[mv_ratio < upper & lower < mv_ratio]
}
这将 return 原始列表中的子集数据帧列表,此处称为 df_list
。
我有一个包含 11 个数据框的列表,每个数据框都具有 44 个变量的相同结构。其中一个变量是比率,我正在尝试 trim 包含离群值的记录。我已经能够使用以下代码得出上限和下限。
首先,我为每个数据帧创建了一个分位数列表:
quartiles <- lapply(class203_in, function(x) {
quartiles <- quantile(x$mv_ratio, type=6)
})
接下来我爆出第一和第三四分位数:
q1 <- lapply(quartiles, function(x) {
q1 <- x[2]
})
# create list of third quartile
q3 <- lapply(quartiles, function(x) {
q3 <- x[4]
})
然后我计算了IQR:
iqr <- lapply(class203_in, function(x) {
iqr <- IQR(x$mv_ratio, type=6)
})
终于想出了上下界:
lower <- mapply(function(x, y) x - (y * 1.5), q1, iqr)
upper <- mapply(function(x, y) (y * 1.5) + x, q3, iqr)
每个对象的结果如下所示(列表中每个对象的上限具有完全相同的结构和名称):
> lower
$`Yr02.25%`
[1] 0.1885
$`Yr03.25%`
[1] 0.2245
$`Yr04.25%`
[1] 0.2005
$`Yr05.25%`
[1] 0.1795
$`Yr06.25%`
[1] 0.2315
$`Yr07.25%`
[1] 0.127
$`Yr08.25%`
[1] 0.06125
$`Yr09.25%`
[1] 0.0365
$`Yr10.25%`
[1] -0.29725
$`Yr11.25%`
[1] -0.2985
$`Yr12.25%`
[1] -0.1045
我现在正尝试使用这两个列表来 trim 我的主要数据框列表中的异常值,其中 mv_ratio 是我尝试 trim 的变量在。我已经接近了,但我似乎无法让它在列表或其他地方踢出数据框的精确副本。这是让我最接近的代码:
class203_out <- mapply(function(x, y, z) x <- x[which(x$mv_ratio > y &
x$mv_ratio < z),], class203_in, lower, upper)
class203_in是数据帧列表。当我 运行 这个时,我得到一个巨大的矩阵。
任何帮助或推动正确的方向将不胜感激。
因为你只处理一个列表,而且你的问题看起来很简单,我建议使用 doParallel
包来做一个 foreach
(如果你愿意,可以并行化,但默认是顺序)。
我还建议对所有内容使用 data.table
,因为。
library(doParallel)
library(data.table)
subsetted_df_list <- foreach(i = seq(df_list)) %do% {
x <- setDT(df_list[[i]])
q <- quantile(x$mv_ratio, type = 6)
iqr <- IDR(x$mv_ratio, type = 6)
lower <- q[2] - iqr * 1.5
upper <- q[4] + iqr * 1.5
x[mv_ratio < upper & lower < mv_ratio]
}
这将 return 原始列表中的子集数据帧列表,此处称为 df_list
。