Выбор аргумента внутри функции на основе сравнения двух векторов

Дан фрейм данных с векторами 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 в описываемую функцию?

не могли бы вы поделиться желаемым результатом df1$x2?

Antonis 21.03.2018 11:46

@Antonis, желаемый результат - результат случайного эксперимента в "example_function". Выходные данные должны представлять собой обновление вектора от x1 до x2, при этом изменения от x1 до x2 происходят в результате случайного эксперимента и заданной вероятности.

C.F. 21.03.2018 12:09

@ C.F, дело в том, что большее количество примеров кодирования при переполнении стека решается предоставлением выборочных данных и примеров желаемого результата, а меньше - описанием. Кроме того, создание вывода примера ужесточает описание требований. Если есть случайность, установка начального числа делает ее воспроизводимой.

Andrew Lavers 21.03.2018 22:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Здесь не нужно делать ничего сложного. Вы можете получить то, что хотите, используя векторные выражения.

Чтобы выбрать вероятности с учетом 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)). Это моя проблема, составляя свой пример, я не думал, что это имеет значение. Есть ли способ учесть это?

C.F. 21.03.2018 12:55

Отредактируйте, чтобы добавить индекс [1]. ПРИМЕЧАНИЕ: я на самом деле не тестировал это изменение, но dea такова, что, поскольку все является вектором, вы можете выбрать первый из любых дубликатов (при условии, что это ваше правило)

Andrew Lavers 21.03.2018 14:32

Спасибо за правку, на первый взгляд кажется, что это работает. Но этот подход подразумевает, что любое значение 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] не является решением.

C.F. 21.03.2018 14:51

Дополнение: в примере в моем комментарии выше x1 [1] = 1 принадлежит y1 [1] = 5. То, что 5 для y1 подразумевает p = 0,2. С другой стороны, x1 [2] также = 1, но принадлежит y1 [2] = 6. Это означает, что p = 0,9.

C.F. 21.03.2018 15:01
Ответ принят как подходящий

Один из способов решить проблему - работать с «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

Другие вопросы по теме