【问题标题】:R: Using lists to trim outliersR:使用列表修剪异常值
【发布时间】:2015-11-17 17:21:29
【问题描述】:

我有一个包含 11 个数据框的列表,每个数据框都有相同的 44 个变量结构。其中一个变量是比率,我正在尝试修剪包含异常值的记录。我已经能够使用以下代码提出上限和下限。

首先,我为每个数据框创建了一个分位数列表:

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

我现在正在尝试使用这两个列表来修剪我的主要数据框列表中的异常值,其中 mv_ratio 是我要修剪的变量。我已经接近了,但我似乎无法让它以列表或其他方式踢出数据帧的精确副本。这是最接近我的代码:

class203_out <- mapply(function(x, y, z) x <- x[which(x$mv_ratio > y &
     x$mv_ratio < z),], class203_in, lower, upper)   

class203_in 是数据框列表。当我运行它时,我得到一个巨大的矩阵。

任何帮助或推动正确的方向将不胜感激。

【问题讨论】:

  • 上述可能重复的问题中的答案应该可以解决您的问题...如果您需要稍微定制的解决方案,您应该能够轻松地稍微修改该答案的代码。

标签: r list outliers mapply


【解决方案1】:

由于您只处理一个列表,而且您的问题看起来很简单,我建议使用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]
}

这将返回原始列表中的子集数据帧列表,此处称为df_list

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多