基于两个向量的比较在函数内选择参数

Selection of argument within a function based on the comparison of two vectors

给定一个包含向量 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

这是我的问题:在上面的示例中,我为参数 "p" 选择了 0.5(手动)。相反,我想 select 基于与 df1 中的 x1 关联的 y1 值的 df2 的概率 p。因此,我想要 p in

df1$x2 <- unlist(lapply(df1$x1,example_function,p))

从 df2 派生。

例如,df$x1[3],它是一个 2,属于 df$y1[3],它是一个 1。df2 表明,y 的 1 与 p = 0.6 相关联。在这种情况下,"example_function" 中 df1$x1[3] 的参数 p 应该是 0.6。如何将这种对值 p 的查询集成到所描述的函数中?

这里不需要做任何复杂的事情。你可以使用 vector-expressions.

得到你想要的

要选择给定 py1 的概率,只需下标:

> p[y1]
[1] 0.1 0.1 0.6 0.6

然后从 x1 中选择你的 x2,样本如下:

> 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  

解决问题的一种方法是使用 "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