基于随机试验的数值对更新函数实现技术问询
问题与解决方案
问题背景
你手头有这样的R代码和数据:
x1 <- c(1,2,3,1,2,3) p <- c(0.1,0.9,0.9,0.1,0.5,0.7) df1 <- data.frame(x1,p)
生成的数据框df1长这样:
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
还定义了一个依赖随机试验的更新函数:
rexp <- function(x,p){ if(runif(1) <= p) return(x + 1) return(x) }
现在想搞清楚:怎么用lapply把这个函数应用到df1$x1的每一个值上,同时对应上df1$p的概率?
解决方案
其实lapply本身是用来处理列表的,但这里咱们需要同时给函数传x1和p这一对对应的值,所以得稍微变通一下,给你两种可行的方式:
方式1:通过行索引遍历
我们可以遍历数据框的每一行索引,每次从对应行里取出x1和p的值传给rexp函数:
# 先生成x2列,注意lapply返回的是列表 df1$x2 <- lapply(1:nrow(df1), function(i) { rexp(df1$x1[i], df1$p[i]) }) # 如果需要把列表转换成数值向量,用unlist就行 df1$x2 <- unlist(lapply(1:nrow(df1), function(i) { rexp(df1$x1[i], df1$p[i]) }))
方式2:先把(x1,p)打包成列表元素
另一种思路是把每一组(x1,p)做成列表的一个元素,再用lapply处理这个列表:
# 把每一对x1和p打包成列表的单个元素 pair_list <- mapply(list, df1$x1, df1$p, SIMPLIFY = FALSE) # 遍历列表,给每个元素里的x和p调用函数 df1$x2 <- unlist(lapply(pair_list, function(pair) { rexp(pair[[1]], pair[[2]]) }))
小补充:其实Map更适合这种场景
虽然你明确问的是lapply,但还是忍不住提一句——Map(可以理解为简化版的mapply)天生就是用来处理这种多参数对应应用的情况,代码会更简洁:
df1$x2 <- unlist(Map(rexp, df1$x1, df1$p))
内容的提问来源于stack exchange,提问作者C.F.
相关产品推荐
相关产品推荐

