2014-02-07 4 views
0

a R novice снова ищет помощи.R комбинирование назначений, имена кодов, внутри петли

Общая ситуация: В настоящее время я создаю скрипт, у меня есть несколько кадров данных за эксперимент. Эксперименты различаются по времени измерениям и количеству реакторов, поэтому мне нужна двумерная гибкость моего сценария для «массажа» данных в нужную форму для желаемых тестов и выделения необходимых данных из нескольких кадров данных. К сожалению, я решил использовать для циклов, чтобы учесть это, что я вижу сейчас, это плохая практика в R, , но я получил возможность изменить направления сейчас.

Проблема: Я пытаюсь добиться того, чтобы одномерная матрица была названа именами объектов, внутри цикла for, мне нужно, чтобы они были в матричном формате из-за дальнейших функций, которые я хочу применить.

# Simple but non- flexible examples of what I want to do: 

# creates two matrix objects 
a1 <- matrix(c(1,2,3,4,5)) 
a2 <- matrix(c(1,2,3,4,5)) 

#names header of the objects name 
colnames(a1) <- "a1" 
colnames(a2) <- "a2" 

это работает, но мне нужно работать с в цикле ...

# here are the two flexible but non- working approaches of mine 

# creates two matrix objects 
a1 <- matrix(c(1,2,3,4,5)) 
a2 <- matrix(c(1,2,3,4,5)) 

# should name object according to progress in loop 
for(i in 1:2) 
{ 
assign(colnames(paste("a",i,sep="",collapse="")),do.call("c",list(paste("a",i,sep="")))) 
} 

, который не является правильное использование правопреемника и создает ошибку. вторая попытка не создает ошибку, но не работает, либо, она создает пустые объекты

# creates two matrix objects 
a1 <- matrix(c(1,2,3,4,5)) 
a2 <- matrix(c(1,2,3,4,5)) 

# should name object according to progress in loop 
for(i in 1:2) 
    { 
     assign(paste("a",i,sep="", colapse=""),do.call("colnames",list(paste("a",i,sep="", colapse="")))) 
    } 

Мой вывод: я не понимаю, правильный способ объединения назначения и COLNAMES, Если кто-то получил предложение как бы я мог его запустить и запустить, это было бы потрясающе.

Так что, прокомментировал, что я искал: R комбинирование назначений и colnames внутри цикла, R с использованием назначений и кодов, R, именование данных с помощью циклов, ... , но, к сожалению, не удалось экстраполировать решения моей проблемы.

ответ

0

Ниже приведена функция, которая по умолчанию принимает любые объекты в родительской среде с именем, которое начинается с a, за которым следуют номера, проверьте, что они являются матрицами столбцов, и если они есть, назовите столбцы с именем объекта.

a1 <- matrix(c(1:5)) 
a2 <- matrix(c(1:5)) 
name_cols() 
a1 
#  a1 
# [1,] 1 
# [2,] 2 
# ... 
a2 
#  a2 
# [1,] 1 
# [2,] 2 
# ... 

А вот код:

name_cols <- function(pattern="^a[0-9]+", env=parent.frame()) { 
    lapply(
    ls(pattern=pattern, envir=env), 
    function(x) { 
     var <- get(x, envir=env) 
     if(is.matrix(var) && identical(ncol(var), 1L)) { 
     colnames(var) <- x 
     assign(x, var, env) 
    } }) 
    invisible(NULL) 
} 

Примечание Я выбрал спецификацию по шаблону, но вы можете легко изменить это, чтобы быть, указав имена переменных (вместо использования ls, просто передать имена и lapply над ними), или потенциально даже objects (хотя вам нужно использовать замену для этого, и мудрость этого становится сомнительной).

В общем случае, если у вас есть несколько связанных объектов, на которых вы будете выполнять связанный анализ (например, в случае изменения столбцов), вы должны действительно рассмотреть их хранение в списках, а не на верхнем уровне. Если вы это сделаете, вы можете легко использовать встроенные функции *pply для работы со всеми вашими объектами одновременно. Например:

a.lst <- list(a1=matrix(1:5), a2=matrix(1:5)) 
a.lst <- lapply(names(a.lst), function(x) {colnames(a.lst[[x]]) <- x; a.lst[[x]]}) 
Смежные вопросы