apply () -подобная функция, извлекающая информацию из нескольких фреймов данных для замены цикла - PullRequest
0 голосов
/ 01 мая 2020

У меня проблема в следующем: у меня есть два кадра данных (parameters и amounts).

> head(parameters)
        Ka       V1        V2   Q        CL
1 5.960224 20.46632  90.48670 5.5 68.192196
2 1.176143 16.05779 132.44959 5.5  6.421357
3 1.324476 34.91569  42.96544 5.5 20.761933
4 2.649055 21.55833 111.89387 5.5  6.868612
5 1.495101 32.97900 140.82672 5.5  4.340567
6 2.807148 29.33883 206.71401 5.5  8.756406

>head(amounts)
  Depot Central Peripheral
1    10       0          0
2    10       0          0
3    10       0          0
4    10       0          0
5    10       0          0
6    10       0          0

Я хотел бы передать каждую строку parameters & amounts в ODE-решатель с именем ode, входящий в пакет deSolve. Я пришел со следующим ответом, используя for l oop, он прекрасно работает, но это занимает много времени, когда число циклов велико (то есть, более 500 итераций). Я хотел бы заменить for l oop на apply -подобную функцию. Это l oop:

Central_concs <- vector()

for(i in 1:nrow(parameters)){
  n_a <- names(amounts)
  amounts_i <- as.numeric(amounts[i, ])
  names(amounts_i) <- n_a
  parameters_i <- parameters[i, ]
  out <- ode(y = amounts_i, times = times, func = TwoComp, parms = parameters_i)
  Central_concs <- cbind(Central_concs, out)
}

Извлечение и переименование имен - это просто проблема с функцией ode, не беспокойтесь об этом. TwoComp, аргумент, переданный ode, - это просто функция, содержащая систему дифференциальных уравнений.

Я пытался применить, но у меня ничего не получилось. Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Может как то так?

parameters_matrix <- as.matrix(parameters)
amoumts_matrix <- as.matrix(amounts)

myfun <- function(i){
  ode(y = amounts_matrix[i, ], times = times, func = TwoComp, parms = parameters_matrix[i,])
}


sapply(X =  1:nrow(parameters), FUN = myfun)
2 голосов
/ 01 мая 2020

Может быть, что-то вроде этого:

custom.ode <- function(i){
  n_a <- names(amounts)
  amounts_i <- as.numeric(amounts[i, ])
  names(amounts_i) <- n_a
  parameters_i <- parameters[i, ]
  out <- ode(y = amounts_i, times = times, func = TwoComp, parms = parameters_i)
  return(out)
}


Central_concs <- lapply(1:nrow(amounts), custom.ode)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...