2015-02-01 2 views
0

У меня есть функция, которая использует список кадров данных (variables) и дает в качестве вывода два кадра данных (для каждого кадра данных в списке), который я хочу сохранить каждый с другое имя переменной (вместо up.val и down.val) и разные имена файлов. И переменные, и имена файлов у меня есть на векторе символов, который я создал.Сохранение whitin цикла с разными именами переменных

filtering_data <- function(x){ 

    x <- as.data.frame(x) 
    pval <- which(x$P.Value < 0.05) 
    pval <- x[pval,] 


    up.pval <- which(pval$t > 0) 
    down.pval <- which(pval$t < 0) 

    up.pval <- pval[up.pval,] 
    down.pval <- pval[down.pval,] 

    save(up.pval, file = file.Rda) 
    save(down.pval, file = file.Rda) 
    } 

lapply(variables, filtering_data) 
+1

Просто побочное замечание, я не рекомендовал бы назвать вашу функцию 'filter', поскольку есть уже база R function 'filter' в пространстве имен' stats'. – nrussell

+0

Спасибо, я изменю имя функции. – biorunner88

ответ

0

Я думаю, что вы хотите использовать assign для присвоения значений новых имен, а затем предоставить имена переменных как list аргумента save. как в:

filtering_data <- function(x,varName,file.rda){ 

    [calculations go here]] 

    # assign() only assigns one value so check the length of varName 
    stopifnot(length(varName)==1) 

    # make the new variable names 
    name.up <- paste0(varName,'.','up') 
    name.down <- paste0(varName,'.','down') 

    # assign the values to them in the current environment 
    assign(name.up,up.pval) 
    assign(name.down,down.pval) 

    # save the named variables 
    save(list=name.up, file=file.rda) 
    save(list=name.down,file=file.rda) 
} 

Кстати, file.rda должен вероятно быть аргументом, а не предполагая, что это уже определено

+0

Не работает. Если я добавлю больше переменных в функцию типа «varName», она возвращает мне что-то вроде «Ошибка en pval $ t: $ operator недопустима для атомных векторов». Если я добавлю четыре строки кода las, я получаю следующее: 'error en save (list = up_varNames, file = file.Rda): objects 'top_k1.up', 'top_k2.up', 'top_Na1. up ',' top_Na2.up ',' top_ox.up ',' top_ter.up ',' top_ypd.up 'не найден ' и ' Сообщение об утере 1: В назначении (up_varNames, up.pval): только первый элемент используется как имя переменной' То же самое для другой строки назначения. – biorunner88

+0

Это потому, что 'assign' присваивает только одну переменную текущей среде. Вам придется перебирать имена переменных ('for (i в seq_along (name.up)) assign (name.up [i], up.pval [i])). Вот почему вы получаете сообщение об ошибке из 'save'. – Jthorpe

+0

ошибка о 'pval $ t' говорит вам, что' pval' - это атомный вектор (возможно, числовой, вы можете использовать 'class (pval)' для поиска). Поскольку 'т' не определен в вашем сообщении, мне не известно, что это за' т' и почему вы его используете. В любом случае оператор '$' не определен для векторов. Может быть, вы хотите 'pval [t]' – Jthorpe

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