Как векторизовать этот процесс в R, не используя слишком много циклов?Как векторизовать этот процесс в R?
У меня есть эта функция:
HM=function(CO,CS,CD,CSD){
if(CO-CS)>1){
return(2^(CS)/(2^(CO)-2^(CSD)))
}
else if(CO-CD)>1){
return(1-2^(CD)/(2^(CO)-2^(CSD)))
}
return(0)
}
В принципе, мне нужно, чтобы получить значение HM для каждой комбинации {CO, CS, CD, CSD} над thoses значений:
CO 25.76031685 25.71126747 25.90163231
CS 24.40528297 24.09929848 23.51999092
CD 25.99405861 25.72906113 25.61374474
CSD 35.94195557 36.07263184 34.00024414
Так что мне нужно чтобы получить эти значения:
HM(25.76031685,24.40528297,25.99405861,35.94195557)
HM(25.71126747,24.40528297,25.99405861,35.94195557)
HM(25.90163231,24.40528297,25.99405861,35.94195557)
HM(25.76031685,24.09929848,25.99405861,35.94195557)
HM(25.71126747,24.09929848,25.99405861,35.94195557)
HM(25.90163231,24.09929848,25.99405861,35.94195557)
HM(25.76031685,23.51999092,25.99405861,35.94195557)
HM(25.71126747,23.51999092,25.99405861,35.94195557)
HM(25.90163231,23.51999092,25.99405861,35.94195557)
etc...
в основном это все комбинации с 4-векторов 3-х элементов:
Vectors :
a=c(1,2,3)
b=c(1,2,3)
c=c(1,2,3)
d=c(1,2,3)
Combinations :
1,1,1,1
2,1,1,1
1,2,1,1
1,1,2,1
1,1,1,2
3,1,1,1
1,3,1,1
etc...
Я не уверен, как подсчитать количество комбинаций. Конечно, я мог бы использовать 4 вложенных цикла, но я хочу научиться делать это с векторизации, так как R слишком медленно для циклов. Я думаю, мы можем использовать expand.grid, но я не знаю, как это сделать. Кроме того, таблица находится в excel, я могу экспортировать ее в .csv, но я не уверен в лучшем способе реализовать этот материал, поэтому спасибо за вашу помощь!
Удивительный Я пришел к тому же выводу в эту ночь. Благодаря ! Однако, когда я добавляю третье ifelse() в HM(), он больше не работает, вы знаете, почему? http://stackoverflow.com/questions/17252466/why-with-in-r-is-doing-vector-operation-in-one-case-and-not-in-the-other – Wicelo
@Wicelo, похоже вы поняли это. Проблема была '&&'. Ответ Роланда очень приятный, с полностью векторизованным подходом. До встречи! –