2013-03-20 1 views
2

У меня есть полдюжины матриц: m1, m2, m3, m4, m5 и m6. Ради простого примера, скажем, они выглядят следующим образом:Применение «get» ко всем элементам в векторе -или- Работа с последовательными переменными в r

m1<- matrix(1:10, 2, 5) 
m2<- matrix(11:20, 2, 5) 
m3<- matrix(21:30, 2, 5) 
m4<- matrix(31:40, 2, 5) 
m5<- matrix(41:50, 2, 5) 
m6<- matrix(51:60, 2, 5) 

В конце концов, я хочу, чтобы применить функцию для всех 6:

f(m1,m2,m3,m4,m5,m6) 

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

paste("m",1:6,sep="") 

Выражение Возвращена строка:

[1] "m1" "m2" "m3" "m4" "m5" "m6" 

Чтобы найти значение, а не имена матриц, я попытался добавить «получить» в смесь, взяв функцию:

get(paste("m",1:6,sep="")) 

Но «получить» выражение только возвращаемые значения для m1 и игнорировали все остальное, что я хотел. Итак, я начал возиться с петлями для:

for(k in 1:6){ 
if(k == 1){b<- paste("m",k,sep="")} 
else{b<- c(b, paste("m",k,sep=""))} 
} 

> b 
[1] "m1" "m2" "m3" "m4" "m5" "m6" 

Это та же строка, что я получил от моей первой попытки. Следовательно, следующее выражение не удалось:

w<- f(b) 

Я также попытался:

w<- f(get(b)) 

Несколько предсказуемо, R признал m1 в качестве матрицы, но игнорировали остальных членов в Б.

I также пытался:

w<- f(get(b[1:6])) 

Когда я это сделал, я получаю тот же результат, что и выше.

Наконец, я также попытался поворота б в списке:

b<- list(m1,m2,m3,m4,m5,m6) 

Я надеялся использовать lapply (б, г), а функция (которую я не писал, и я обязан использовать) не работает должным образом при помещении в лапы.

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

+1

Попробуйте 'sapply (ls (pattern =" m "), get)'. –

+2

Трудно быть слишком конкретным, но я согласен с одним из ответов ниже: настоящая проблема заключается в том, что вы делаете что-то вроде не-R-подобного. Лучшее решение, вероятно, состоит в том, чтобы изменить вашу функцию 'f' так, чтобы он принимал единственный список матриц, а не длинный список аргументов. – joran

ответ

2

Вы могли бы идти об этом в ту сторону. Поместите свои матрицы в список, а затем lapply свою функцию f ко всем элементам list.

m1<- matrix(1:10, 2, 5) 
m2<- matrix(11:20, 2, 5) 
m3<- matrix(21:30, 2, 5) 
m4<- matrix(31:40, 2, 5) 
m5<- matrix(41:50, 2, 5) 
m6<- matrix(51:60, 2, 5) 

f<-function(x) sum(x) # A test function 
l<-list(m1,m2,m3,m4,m5,m6) 
lapply(l,f) 

Вы могли бы сказать, что это нормально, но что происходит, когда у меня есть тысячи матриц? Как создать этот список? Большую часть времени вы можете создать свой matrices или прочитать их в списке с самого начала. Вот как вы бы генерировать их в виде списка:

start<-seq(1,51,by=10) 
gen<-function(x) matrix(x:(x+9),2,5) 
l<-lapply(start,gen) 

Обычно, если вы начинаете думать о переборе над именами переменных, вы делаете это неправильно. Это верно на большинстве языков программирования, по моему опыту.

1

Попробуйте

m1 <- matrix(1:4, ncol=2) # some dummy matrices 
m2 <- m1*2 
m3 <- m2+2 
m4 <- m1*3 


b <- paste0('m', 1:4) 
b 

for(i in 1:length(b)) { 
print(get(b[i])) 
    } 

Или с помощью lapply

lapply(b, get) 
2

Сохраните ваши матрицы в списке l = list(m1,m2,m3,m4,m5,m6) и используйте do.call(f, l).

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