2017-02-16 15 views
1

Я хотел бы запустить сценарий this несколько раз (и после этого сделать несколько других вещей). Данные в текстовом файле (с именем test.txt) в следующем виде:Множественное выполнение скрипта либо с помощью функции apply, либо с помощью цикла for

A B C D E 
1 2 2 1 9 
3 5 1 3 0 
2 NA 4 13 2 

и ввозится с использованием

test <- read.table("test.txt",header=TRUE) 

Данные могут быть преобразованы в другой формат, и он может быть использован без заголовков ,

Я знаю, что должен использовать функцию apply, и я много раз искал использование функций apply и для циклов, но я не смог их успешно реализовать.

Например, я получаю сообщение об ошибке после выполнения следующего кода:

for(i in names(table)){ 
    message("Name of the data set:", i) 
    outlierKD(table, i)} 

Ошибка в Eval (выражение, Envir, Enclos): объект 'я' не found`.

Я нашел обсуждение here об индексе передачи контура и также обнаружил, что exists(i) возвращает ложь, а сообщение появляется правильно.

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

ответ

0

(я хотел изменить сценарий немного, и сохранить его в файле .r, а скрипт, который будет выполнить его несколько раз (и делают некоторые другие вещи), как это :)

test <- read.table("test.txt",header=TRUE) 
source("outlierKD_mod.r") 
source("loopscript.r") 
loopscript(test) 

это не сработало, и я начал создавать единый скрипт (где никаких функций не объявлены) на основе @ коде Самуила, который может скопировать в консоль R. Единственное, что должно было быть изменен по сценарию outlierKD является то, что эта линия должна была быть заменена:

assign(as.character(as.list(match.call())$test), test, envir = .GlobalEnv) 

с этим:

test[x]=var_name 

This команда удалит столбец добавляется к кадру данных по проверка на выброс:

test <- subset(test, select = -c(i)) 
0

Вы могли бы попробовать что-то вроде этого:

source("https://datascienceplus.com/rscript/outlier.R") 

A = c(1, 3, 2, 2, 3) 
B = c(2, 5, 0, 1, 6) 
C = c(2, 1, 4, 7, 8) 
D = c(1, 3, 99, 4, 2) 
E = c(9, 0, 2, 8, 4) 

df = data.frame(A, B, C, D, E) 

x <- 0 

for (i in df) { 
    x <- x + 1 
    names <- names(df) 
    message("Variable: ", names[x]) 
    outlierKD(dt = df, var = i) 
} 

Надеется, что это помогает!

+0

По какой-то причине, когда сценарий должен удалить outlier, исходный столбец остается неизменным и создается новый столбец с именем 'i', переехал. – zoli

0

В этом случае использование петли в этом случае проще.

test <- read.table("test.txt", header=TRUE) #copied and pasted 
test 

source("https://datascienceplus.com/rscript/outlier.R") #function 

for(i in 1:ncol(test)) outlierKD(dt=test, i) 

Тогда в R консоли (в интерактивном режиме), нажмите клавишу Y выявить участки

+0

К сожалению, сценарий не «видит» данных таким образом: 'Список отклоняющихся: 0 из 1 наблюдение Доля (%) отклоняющиеся: 0 среднего значения выбросов: NaN Среднего без удаления выбросов: 1 Среднее, если мы удаляем выбросы: 1' – zoli