2015-01-25 3 views
0

В настоящее время я имею большую матрицу (3000x20) и хочу вычислить значение, используя значения в первой строке, первом столбце и векторе. Мой набор данных (в Excel), как это (я использую VBA код для создания этой первенствовать):Как использовать функцию apply вместо вложенного цикла?

SumRow = 0 
SumCol = 0 
RowInterval = 0.001 
ColInterval = 0.01 
For i = 2 To 3001 
     Cells(i, 1).Value = SumRow + RowInterval 
     SumPD = Cells(i, 1).Value 
    Next i 
    For j = 2 To 21 
     Cells(1, j).Value = SumCol + ColInterval 
     SumRho = Cells(1, j).Value 
    Next j 

настоящее время я использую следующий R код сделать расчет

InputVector <- c(1,2,3,4,5,6,7,8,9,10) 
Testing<-read.csv("InputFile.csv", header=FALSE) 
    for (m in (2:(3001))) 
    { for (n in (2:21)) 
     { Sum = 0 
      Row = Testing(m,1) 
      Col = Testing(1,n) 
      for (p in (1:length(InputVector))) 
        { Sum = Sum + sqrt((1-Col)/Col)*exp(Row) } 
       Testing[m,n] = Sum } } 
write.csv(Testing, "TestingOutput.csv") 

В основном это первые путы вектор (значения x) в формулу f (x), и я хочу напечатать сумму f (x) на excel с разными параметрами, перечисленными в первой строке и первом столбце в excel. Я запускаю вышеуказанный код, и он работает, но это занимает очень много времени. Я новичок в применении функции, и могу ли я узнать, как я могу использовать функцию apply, чтобы ускорить вычисление и сделать тот же вывод, что и выше?

+1

'apply' ничего не ускорит, если вы не будете писать более эффективную процедуру (как это то же' для 'loop вы уже используете). Если вы хотите получить помощь, я предлагаю вам предоставить часть набора данных InputFile.csv и показать желаемый результат. –

+0

Я думаю, что есть ошибка в коде VBA. Вы хотите «SumRow = Cells (i, 1) .Value' и' SumCol = Cells (1, j) .Value'. – tchakravarty

+0

У вас нет нигде рядом с юридическим кодом R. – tchakravarty

ответ

0

Вот три линии R решение вашей проблемы, в том числе генерации данных:

library(reshape2) 

# generate the combinations to iterate over 
vInput = seq(1, 10) 
dfSeq = expand.grid(rowSeq = seq(from = 0, by = 0.001, length.out = 3000), 
      colSeq = seq(from = 0, by = 0.01, length.out = 20)) 

# generate the values 
dfSeq = cbind.data.frame(result = mapply(function(row, col) { 
    length(vInput)*sqrt((1-col)/col)*exp(row) 
}, dfSeq$rowSeq, dfSeq$colSeq), dfSeq) 

# cast them in the shape required 
dfSeqWide = dcast(dfSeq, rowSeq~colSeq, value.var = "result") 
Смежные вопросы