我试图了解导致 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岁以下的孩子,则没有资格。
您会得到不同的答案,因为您拨打了
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
值),然后根据需要分配给适当的元素。