R 中循环采样的神秘错误

问题描述 投票:0回答:1

我试图了解导致 R 代码中出现此错误的原因,我感觉 R 正在给我加油。

sample() 函数似乎会根据我如何分配它而改变?

无论如何,这是 MRE:

#Sampling Bug MRE
rm(list = ls())
library(tidyverse)
ages=c(paste0("CHILD",seq(1,10),"AGE"))
set.seed(26)
df=c()
for(i in 1:10){
  x=round(runif(1:100,min=1,max=20),0)
  df = as.data.frame(cbind(df,x))
}
names(df)=ages

set.seed(26)
df$`Sampled Child`=0
test_vector=c()
for(i in 1:nrow(df)){
  childs_age = unlist(c(as.numeric(df[i,ages])))
  slice=which(childs_age<=17)
  if(length(slice)>=1){
    df$`Sampled Child`[i]=sample(x=slice,size=1,replace = F)
    test_vector=append(test_vector,sample(x=slice,size=1,replace = F))
  }
  else{
    df$`Sampled Child`[i]="Ineligibile"
    test_vector=append(test_vector,"Ineligibile")
  }
}
df$test=test_vector
sum(df$`Sampled Child`==df$test)

我只需要有人解释为什么用 df$

Sampled Child
[i] 分配值会分配不同的数字而不是仅仅将其附加到向量?

蒂亚!

我正在尝试仅对 17 岁以下的儿童进行采样。一旦我知道哪些孩子小于 17 岁,我就会随机挑选一个。如果没有17岁以下的孩子,则没有资格。

r random sample sampling survey
1个回答
1
投票

您会得到不同的答案,因为您拨打了

sample()
两次。

如果你的代码看起来像这样:

 if(length(slice)>=1){
    cur_samp <- sample(x=slice,size=1,replace = FALSE)
    df$`Sampled Child`[i] <- cur_samp
    test_vector=append(test_vector,cur_samp)
  }

(同样在另一个块中)那么两个结果应该相等。

无论如何,在 R 中,通过重复追加数据帧和向量(或插入到向量末尾以外的位置)来增长数据帧和向量的效率很低;这是 R Inferno 的第二圈。最好先创建一个适当长度的向量(例如,填充 NA

 值),然后根据需要分配给适当的元素。

© www.soinside.com 2019 - 2024. All rights reserved.