Я пытаюсь понять, что вызывает эту ошибку в моем коде 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), а затем по ходу присваивать его соответствующим элементам.
Я согласен, что в вашем случае это, вероятно, не имеет значения, но лучше не привыкать.
Возможно, вы захотите использовать NA вместо «Недопустимо» в качестве результата, когда нет дочерних элементов < 17, чтобы весь столбец оставался числовым (в противном случае все значения будут приведены к типу символов).
Если это решило вашу проблему, вам рекомендуется нажать на галочку, чтобы принять ее...
По вашему второму вопросу (выбор детей > 17 лет) я не вижу ничего очевидного. Потребуется минимальный воспроизводимый пример (и это будет отдельный вопрос, на вопрос, который вы здесь задали, уже дан ответ).
Кажется, я понял: когда длина вектора среза равна всего 1, функция выборки, похоже, интерпретирует входные данные по-другому. Еще раз спасибо за вашу помощь!
Да, это классическая sample() ловушка: stackoverflow.com/questions/13990125/…
Спасибо за быстрый ответ! Мне придется прочитать ту статью, на которую вы дали ссылку. Я работаю с довольно небольшими наборами данных (менее 100 одновременно), но согласен, что это неэффективно. Однако у меня есть один дополнительный вопрос: кажется, что этот фрагмент не работает должным образом в моем коде, но он работает для MRE, хотя я только что скопировал его. С моей стороны бывают случаи, когда выбирается ребенок старше 17 лет. Есть ли что-нибудь, что вы видите, что заставило бы вас поверить, что это происходит? В моей версии набора данных указаны значения NA, поскольку не в каждом домохозяйстве есть 10 детей.