使用示例函数删除 for 循环

标签 r

我有以下数据结构:

set.seed(100)
x <- data.frame("smp_1"=runif(20)*100,"smp_2"=runif(20)*99)
x["weight_1"] = x$smp_1/sum(x$smp_1)
x["weight_2"] = x$smp_2/sum(x$smp_2)


> head(x)
     smp_1     smp_2   weight_1    weight_2
1 66.61718 68.976341 0.05721288 0.061115678
2 24.65804 77.966842 0.02117709 0.069081607
3 66.10397  1.611913 0.05677212 0.001428216
4 93.95866  1.793973 0.08069459 0.001589529
5 19.96638 31.008240 0.01714774 0.027474488
6 66.35187 97.033923 0.05698502 0.085975770

现在我想创建一个新的数据框,使用权重列作为概率从每个 smp 列中进行采样,并将每个列样本添加到新的数据框和新列中。我可以使用 for 循环来做到这一点:

tempdf <- data.frame(matrix(0,ncol=0,nrow=1000))
for (k in 1:2){
  tempdf[,paste0("sim_",k)] <- sample(x[,paste0("smp_",k)],size=1000, replace=T, prob = x[,paste0("weight_",k)])
}

我的问题是如何在没有 for 循环的情况下以更有效的方式做到这一点?我将对 100k 多个列进行采样,因此我需要快速完成一些操作。

最佳答案

这是一个 data.table 方法。

在答案 ans 中,变量值(1 或 2)是您的 k

library(data.table)
#melt to long format
DT <- melt( setDT(x) , 
            id.vars = NULL, 
            measure.vars = patterns( smp = "^smp", 
                                     weight = "^weight"))
#pull samples
ans <- DT[ , .( sim = sample( smp, 
                              size = 1000, 
                              replace = TRUE, 
                              prob = weight)), 
           by = .(variable) ]


#    variable      sim
# 1:        1 69.02905
# 2:        1 30.77661
# 3:        1 37.03205
# 4:        1 35.75249
# 5:        1 48.37707
# 6:        1 55.23224

关于使用示例函数删除 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56060296/

相关文章:

r - sliderTextInput 显示不正确的值?

R - 使用 ggplot2- 和 raster-packages 地理引用光栅图像的原始颜色

r - 如何计算调查加权数据比例差异的 95% CI?

从 xts 对象中删除重复的行

r - 将积分值保存在 R 中的数组中

r - R Shiny 中的图像幻灯片

r - (R) 使用 quantreg 包绘制分位数回归系数分布

r - 判断公式是否包含随机效应的最佳方法?

r - 是和继承有什么区别?

用于提取 lme4 包中固定效应标准错误的 R 代码