Я борюсь с синтаксисом map, когда я хочу иметь гибкое количество столбцов и аргументов ... трудно кодировать это динамически .
Конкретный пример ...
Предположим, у меня есть следующая матрица для произвольного J :
set.seed(1)
J=2
n = 100
BB = data.table(r=1:n)
for(i in seq(J)) set(x = BB, j = paste0('a',i), value = rnorm(n, 1, 7))
for(i in seq(J^2)) set(x = BB, j = paste0('b',i), value = rnorm(n, 1, 7))
for(i in seq(J)) set(x = BB, j = paste0('p',i), value = rnorm(n, 1, 7))
Таким образом, вывод будет ...
> head(BB)
r a1 a2 b1 b2 b3 b4 p1 p2
1: 1 -3.385177 -3.342567 3.865813 7.255716 8.521087 1.541122 -1.38746886 -3.9529776
2: 2 2.285503 1.294811 12.822113 -6.331087 14.269583 -1.078080 11.51697174 14.8010041
3: 3 -4.849400 -5.376452 12.106119 14.799362 -3.220981 -7.282696 4.69815399 0.3700092
Я хочу создать функцию, которая создает новые столбцы из существующих столбцов следующим образом ..
(так как J = 2):
Lambda1 = exp(a1 + b1p1 + b2p2)
Lambda2 = exp(a2 + b3p1 + b4p2)
Если J = 1, это будет:
Lambda1 = exp(a1 + b1p1)
Если J = 3…
Lambda1 = exp(a1 + b1p1 + b2p2 + b3p3)
Lambda2 = exp(a2 + b4p1 + b5p2 + b6p3)
Lambda3 = exp(a3 + b7p1 + b8p2 + b9p3)
Вывод должен быть:
> head(BB)
r a1 a2 b1 b2 b3 b4 p1 p2 lambda1 lambda2
1: 1 -3.385177 -3.342567 3.865813 7.255716 8.521087 1.541122 -1.38746886 -3.9529776 5.547749e-17 5.862180e-10
2: 2 2.285503 1.294811 12.822113 -6.331087 14.269583 -1.078080 11.51697174 14.8010041 2.688353e+24 1.012574e+65
3: 3 -4.849400 -5.376452 12.106119 14.799362 -3.220981 -7.282696 4.69815399 0.3700092 9.401501e+24 8.370005e-11
Моя попытка решения:
Я думаю, это должно выглядеть примерно так, хотя J ^2 р запчасти скинули.Это решение игнорирует его.
BB[,
(paste0("lambda",seq(J))) := Map(
function(a,b,p) exp(a + b * p),
mget(paste0("a", seq(J))),
mget(paste0("b", seq(J))),
mget(paste0("p", seq(J)))
)
]