2016-05-30 3 views
-1

Я пытаюсь создать функцию для ввода исключений в существующий фрейм данных.Вставка выбросов в фрейм данных

Я начал создавать новый dataframe outs с использованием значений исходного кадра данных max и min. Эта фрейма данных outs будет содержать некие amount данных с выбросами. Позже я хочу вставить выпадающие значения фрейма данных outs в исходный фрейм данных.

То, что я хочу получить, - это функция для ввода определенного количества выбросов исходному фрейму. У меня есть разные проблемы, например: Я знаю, если я правильно я использую runif создать dataframe отклоняющихся и второй я не знаю, как впрыснуть выбросы в temp

код, который я пытался до сих пор является:

addOutlier <- function (data, amount){ 
maxi <- apply(data, 2, function(x) (mean(x)+(3*(sd(x))))) 
mini <- apply(data, 2, function(x) (mean(x)-(3*(sd(x))))) 
temp <- data 
amount2 <- ifelse(amount<1, (prod(dim(data))*amount), amount) 
outs <- runif(amount2, 2, min = mini, max = maxi) # outliers 
if (amount2 >= prod(dim(data))) stop("exceeded data size") 
for (i in 1:length(outs)) 
    temp[sample.int(nrow(temp), 1), sample.int(ncol(temp), 1)] <- outs 
return (temp) 
} 

Пожалуйста, любая помощь, чтобы сделать эту работу, буду глубоко признателен

+0

Я не уверен, что понимаю вашу цель, но я думаю, что у вас есть ошибка в коде. 'runif (n, mini, maxi)' даст вам значения 'n' между двумя указанными вами крайностями. Вероятно, это не будет выбросом и, конечно же, не будет гарантировано. –

+0

@Alex Я вижу проблему, любое предложение, как я могу сделать, чтобы гарантировать, что у вас есть выбросы – mina

+0

Вы не определили, что вы подразумеваете под «outlier» .... очевидно, 'runif (n, -Inf, mini)' , 'runif (n, maxi, Inf)' будет работать, но это, вероятно, не реалистично. –

ответ

1

Я понимаю, что то, что вы пытаетесь достичь добавляют определенное количество выбросов в каждый столбец в вашем векторе. Кроме того, вы, похоже, также изучаете добавление% выбросов в каждый столбец. Я записал решение только для первого случая, но последнее должно быть довольно легко реализовать, если оно вам действительно нужно. Обратите внимание, как я сломал вещи на две функции, чтобы (надеюсь) помочь прояснить, что происходит. Надеюсь это поможет!

add.outlier.to.vector <- function(vector, amount) { 
    cells.to.modify <- sample(1:length(vector), amount, replace=F) 
    mean.val <- mean(vector) 
    sd.val <- sd(vector) 
    min.val <- mean.val - 3 * sd.val 
    max.val <- mean.val + 3 * sd.val 
    vector[cells.to.modify] <- runif(amount, min=min.val, max=max.val) 
    return(vector) 
} 
add.outlier.to.data.frame <- function (temp, amount){ 
    for (i in 1:ncol(temp)) { 
    temp[,i] <- add.outlier.to.vector(temp[,i], amount) 
    } 
    return (temp) 
} 

data <- data.frame(
    a=c(1,2,3,4), 
    b=c(7,8,9,10) 
) 
add.outlier.to.data.frame(data, 2) 
+0

Полезная функция, однако есть ли способ сохранить исходное среднее значение набора данных, поэтому я могу видеть введенные выбросы – mina