随机实验与价值对相关的功能

时间:2018-03-24 13:37:57

标签: r function dataframe random subscript

我有两个向量x1和p:

x1 <- c(1,2,3,1,2,3)
p <- c(0.1,0.9,0.9,0.1,0.5,0.7)

两个向量形成值对,请参阅df1:

df1 <- data.frame(x1,p)
> df1
  x1   p
1  1 0.1
2  2 0.9
3  3 0.9
4  1 0.1
5  2 0.5
6  3 0.7

以下函数用于将向量df1 $ x1更新为向量df1 $ x2,具体取决于随机实验和概率p:

rexp <- function(x,p){
  if(runif(1) <= p) return(x + 1)
  return(x)
}

使用lapply,函数&#34; rexp&#34;应用于每个df1 $ x1值。根据随机实验,x2的值保持等于x1或增加+ 1。 在下面的例子中,p等于0.5:

set.seed(123)
df1$x2 <- unlist(lapply(df1$x1,rexp,0.5))

> df1
  x1   p x2
1  1 0.1  2
2  2 0.9  2
3  3 0.9  4
4  1 0.1  1
5  2 0.5  2
6  3 0.7  4

现在我的问题:我想要论证&#34; p&#34;在&#34; rexp&#34;引用向量df1 $ p。 例如,df1 $ x1 [1]的p应为0.1(可以在df1 $ p [1]中看到):unlist(lapply(df1 $ x1 [1],rexp,df1 $ p [1]))。 p为df1 $ x1 [5]应为df1 $ p [5],即0.5:unlist(lapply(df1 $ x1 [5],rexp,df1 $ p [5]))

所需的输出应该是:

> unlist(lapply(df1$x1,rexp,df1$p))
[1] 1 3 4 1 2 4
#where 1 refers to rexp(df1$x1[1],df1$p[1]),
#3 refers to rexp(df1$x1[2],df1$p[2]),
#4 refers to rexp(df1$x1[3],df1$p[3]) and so on... 

这样做&#34;手动&#34;导致:

set.seed(123)
> unlist(lapply(df1$x1[1],rexp,df1$p[1]))
[1] 1
> unlist(lapply(df1$x1[2],rexp,df1$p[2]))
[1] 3
> unlist(lapply(df1$x1[3],rexp,df1$p[3]))
[1] 4
> unlist(lapply(df1$x1[4],rexp,df1$p[4]))
[1] 1
> unlist(lapply(df1$x1[5],rexp,df1$p[5]))
[1] 2
> unlist(lapply(df1$x1[6],rexp,df1$p[6]))
[1] 4

如何&#34; rexp&#34;调整,以便该函数使用每个df1 $ x1值的特定df1 $ p值? 注意:此时,使用&#34; lapply&#34;很重要,因为函数&#34; rexp&#34;中的每个df1 $ x1值都是如此。应绘制一个新的随机数。 我很高兴有任何帮助!

1 个答案:

答案 0 :(得分:3)

使用您定义的功能,您可以

df1$x2 <- mapply(rexp, df1$x1, df1$p)

但是,您也可以利用矢量化并简单地使用

df1$x2 <- df1$x1 + (runif(nrow(df1)) <= df1$p)

通过这种方式,我们将向量df1$x1与被强制为二进制向量的逻辑向量runif(nrow(df1)) <= df1$p进行逐元素求和(TRUE变为1,FALSE变为0)。比较<=也是按元素完成的,我们从均匀分布中得到与行数一样多的不同值。

关于您的方法,请注意,当p修复后,则不需要lapply,因为它会返回一个列表,您可以改为使用

df1$x2 <- sapply(df1$x1, rexp, 0.5)