基于两个向量的比较在函数内选择参数
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.
得到你想要的
要选择给定 p
和 y1
的概率,只需下标:
> 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
给定一个包含向量 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.
得到你想要的要选择给定 p
和 y1
的概率,只需下标:
> 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