У меня есть два набора данных, хранящихся в таблицах, один из которых - это набор [a, b]
, а другой - [x, Sx, y, Sy, rho]
. У меня есть функция вероятности f
, которая требует (a, b, x, Sx, y, Sy, rho)
. В конце концов, я хочу найти сумму результатов вероятности по всем [x, Sx, y, Sy, rho]
за первые [a, b]
. Тогда найти сумму для всех [x, Sx, y, Sy, rho]
над вторым [a, b]
и т.д ...Как избежать нескольких циклов с несколькими переменными в R
Я хотел бы иметь несколько сот строк в файле [x, Sx, y, Sy, rho]
и несколько сот тысяч строк в файле [a, b]
.
Мне интересно, есть ли способ сделать это, не используя две петли? Я пробовал следующее, и это работает не так, как я хочу, но я знаю, что это будет слишком медленно.
Я не знаю, поможет ли это, но я добавил функцию в код. Извините, что сама функция беспорядок и не отформатирована должным образом.
# data file with (a, b)
data <- matrix(c(1, 0, 1, 1, 0.5, 0), nrow=3, ncol=2)
colnames(data) <- c("a", "b")
Ndat <- dim(data)
Ndata <- Ndat[1]
# data2 file with (x, Sx, y, Sy, rho)
data2 <- matrix(c(1, 0.1, 1, 0.1, 0.002, 2, 0.1, 2, 0.1, 0.000001,
2, 0.1, 1, 0.1, 0.002), nrow=3, ncol=5)
colnames(data2) <- c("x", "Sx", "y", "Sy", "rho")
Ndat2 <- dim(data)
Ndata2 <- Ndat[1]
# function requires variables (a, b, s, Sx, y, Sy, rho)
Prob <- function(a, b, Xi, sX, Yi, sY, rho) {sqrt(1 + a^2) * (
exp(-((b + a * Xi - Yi)^2/(
2 * ((a^2 * sX^2) -
(2 * a * rho * sX * sY) + sY^2)))) * sqrt((
1 - rho^2)/(
a^2 * sX^2 - 2 * a * rho *sX *sY + sY^2))/(
sqrt(2 * pi) * sqrt(1 - rho^2)))
}
# Here is my weak attempt
Table <- NULL
Table <- for (j in 1:Ndata) {
sum (for (i in 1:Ndata2) {
Datatable[i] = Prob(data[j, a], data[j, b], data2[i, x],
data2[i, Sx], data2[i, y], data2[i, Sy],
data2[i, rho])
})
}
Я имею очень трудное время оборачивать голову вокруг apply
функций и когда они могут/должны быть использованы. Я знаю, что я, вероятно, не добавил достаточно информации, поэтому любые предложения, которые могут мне помочь, были бы замечательными. Я довольно новичок в программировании, а также в R, поэтому, пожалуйста, простите любой неподходящий словарь или форматирование.
Возможно, лучший способ определить число или строки в data
, чтобы получить Ndata
как глобальный, но это первые, на что я наткнулся.
Функция не должна быть рекурсивной, но теперь я вижу, что это так, как я ее написал. Я потратил много часов на интро-руководства R, и мне очень трудно понять, как лучше всего реализовать набор функций apply
.
Я бы хотел, чтобы одна итерация применяла эту функцию к каждой строке в data2
с использованием a, b
из первой строки data
. Тогда sum
вероятность для всех из них. Тогда следующая итерация следует суммировать все вероятности для строки 2 data
с использованием a, b
применительно к каждой строке data2
Вы пытаетесь найти какую-то форму рекурсивного программирования? Ваша функция 'f' вызывает себя, но неясно, как она должна работать. – gung