2015-11-17 2 views
0

У меня есть список из 11 фреймов данных, каждый из которых имеет структуру sames из 44 переменных. Одна из переменных - это отношение, и я пытаюсь обрезать записи, содержащие выбросы. Мне удалось найти верхнюю и нижнюю границы, используя следующий код.R: Использование списков для обрезки обрезков

Во-первых, я создал список квантилей для каждого кадра данных:

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 <- 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) 

класс203_in - это список фреймов данных. Когда я запускаю это, я получаю огромную матрицу.

Любая помощь или толчок в правильном направлении были бы весьма полезными.

+0

Возможный дубликат [Ярлыки или оценка выбросов в R] (http://stackoverflow.com/questions/32870703/label-or-score-outliers-in-r) –

+0

Ответ в вышеупомянутом возможном дублирующем вопросе должен решить ваша проблема ... вы должны иметь возможность легко изменить код ответа немного, если вам нужно немного настроенное решение. –

ответ

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] 
} 

Это будет возвращать список subsetted кадров данных из исходного списка, который называется здесь df_list.

+0

Это работало как шарм! Большое спасибо mkemp6. –

Смежные вопросы