Дан фрейм данных с векторами x1 и y1:
x1 <- c(1,1,2,2,3,4)
y1 <- c(0,0,1,1,2,2)
df1 <- data.frame(x1,y1)
Кроме того, у меня есть фрейм данных с разными значениями вектора y1 и соответствующей вероятностью:
y <- c(0,1,2)
p <- c(0.1,0.6,0.9)
df2 <- data.frame(y,p)
Следующая функция сравнивает заданную вероятность (p) со случайным числом (runif (1)). В зависимости от результата сравнения значение df $ x1 изменяется и сохраняется в df $ x2 (для каждого значения x1 необходимо нарисовать новое случайное число):
example_function <- function(x,p){
if (runif (1) <= p) return(x + 1)
return(x)
}
set.seed(123)
df1$x2 <- unlist(lapply(df1$x1,example_function,0.5))
> df1$x2
[1] 2 1 3 2 3 5
Вот моя проблема: в приведенном выше примере я выбрал 0,5 для аргумента «p» (вручную). Вместо этого я хотел бы выбрать вероятность p из df2 на основе значений y1, связанных с x1 в df1. Соответственно хочу р в
df1$x2 <- unlist(lapply(df1$x1,example_function,p))
быть производным от df2.
Например, df $ x1 [3], который равен 2, принадлежит df $ y1 [3], который равен 1. df2 показывает, что 1 для y соответствует p = 0,6. В этом случае аргумент p для df1 $ x1 [3] в "example_function" должен быть 0,6. Как можно интегрировать такой запрос для значения p в описываемую функцию?
@Antonis, желаемый результат - результат случайного эксперимента в "example_function". Выходные данные должны представлять собой обновление вектора от x1 до x2, при этом изменения от x1 до x2 происходят в результате случайного эксперимента и заданной вероятности.
@ C.F, дело в том, что большее количество примеров кодирования при переполнении стека решается предоставлением выборочных данных и примеров желаемого результата, а меньше - описанием. Кроме того, создание вывода примера ужесточает описание требований. Если есть случайность, установка начального числа делает ее воспроизводимой.





Здесь не нужно делать ничего сложного. Вы можете получить то, что хотите, используя векторные выражения.
Чтобы выбрать вероятности с учетом p и y1, просто добавьте индекс:
> p[y1]
[1] 0.1 0.1 0.6 0.6
а затем выберите свой x2 из x1 и образец следующим образом:
> ifelse(runif (1) <= p[y1], x1, x1 + 2)
[1] 3 4 3 4
df1$x2 <- unlist(lapply(df1$x1,
function(z) {
example_function(z, df2$p[df2$y == df1$y1[df1$x1 == z][1])
}))
df1
# x1 y1 x2
# 1 1 0 1
# 2 2 0 2
# 3 3 1 4
# 4 4 1 4
# 5 5 2 6
# 6 6 2 7
Спасибо за сообщение, это решение отлично подходит для моего примера выше. Это именно то, что я хотел. Однако это решение не работает, если вектор x1 содержит несколько равных значений (например, x1 <- c (1,1,2,2,3,4) вместо x1 <- c (1,2,3,4, 5,6)). Это моя проблема, составляя свой пример, я не думал, что это имеет значение. Есть ли способ учесть это?
Отредактируйте, чтобы добавить индекс [1]. ПРИМЕЧАНИЕ: я на самом деле не тестировал это изменение, но dea такова, что, поскольку все является вектором, вы можете выбрать первый из любых дубликатов (при условии, что это ваше правило)
Спасибо за правку, на первый взгляд кажется, что это работает. Но этот подход подразумевает, что любое значение x имеет одинаковую вероятность, верно? Однако есть также одинаковые значения x, которые имеют разные значения y и, следовательно, разные значения p. Например, для df1: «x1 <- c (1,1,2,2) и y1 <- c (5,6,1,6)» и для df2: «y <- c (1,5,6) и p <- c (0,2,0,5,0,9) ». Таким образом, добавление индекса [1] не является решением.
Дополнение: в примере в моем комментарии выше x1 [1] = 1 принадлежит y1 [1] = 5. То, что 5 для y1 подразумевает p = 0,2. С другой стороны, x1 [2] также = 1, но принадлежит y1 [2] = 6. Это означает, что p = 0,9.
Один из способов решить проблему - работать с «merge» и «mapply» вместо «lapply»:
df_new <- merge(df1, df2, by.x = 'y1', by.y = 'y')
set.seed(123)
df1$x2 <- mapply(example_function,df1$x1,df_new$p)
> df1
x1 y1 x2
1 1 0 1
2 1 0 1
3 2 1 3
4 2 1 2
5 3 2 3
6 4 2 5
не могли бы вы поделиться желаемым результатом
df1$x2?