r - 具有与值对相关的随机实验的函数

标签 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

以下函数用于根据随机实验和概率 p 将向量 df1$x1 更新为向量 df1$x2:

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

使用 lapply,函数“rexp”应用于每个 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

现在我的问题是:我希望“rexp”中的参数“p”引用向量 df1$p。 例如,df1$x1[1] 的 p 应为 0.1(如 df1$p[1] 中所示):unlist(lapply(df1$x1[1],rexp,df1$p[1]))。 df1$x1[5] 的 p 应该是 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... 

“手动”执行此操作会导致:

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

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

最佳答案

使用您定义的函数,您可以这样做

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)

关于r - 具有与值对相关的随机实验的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49465332/

相关文章:

r - .Rnw 文件中的 Perl : the 'tilde' character

R - 使用函数过滤向量

javascript - 在onsubmit中调用javascript函数

javascript - 损坏的代码?为什么它停止工作

python - 为每一行创建的 Pandas DataFrame

python - 如何将两列合并为一个数据框?

python - 拆分 Pandas 数据框

macos - 使用ggplot2在R中保存pdf文件时出现问题

r - 如何计算给定时间间隔内的小时数

r - R 中稀疏矩阵的多核求解