Вот мой метод грубой силы:
samp315<-function(n=20, desmean=3.15, distance=0.001) { # create a function with default n=20 and range 3.149-3.151
x<- c(4.0, 3.7, 3.3, 3.0, 2.7, 2.3, 2.0, 1.7, 1.3, 1.0)
samp<-0 # reset samp to 0
i<-0 # reset my counter to zero
while (!between(mean(samp),desmean-distance,desmean+distance) & i<1000000) { # the following will run continuously until a sample (samp) with a mean that falls within the specified range is found, OR until 1 million attempts have been made
samp<-sample(x,n,replace=TRUE) # try to generate a sample of n times from the list of values (x)
i=i+1 # add to counter towards 1 million
}
ifelse(i<1000000,samp,warning("Couldn't find an appropriate sample, please select a lower n, a desired mean closer to 2.5, or a greater distance")) # if the while loop ended because the counter reached a million, exit with an error, otherwise, return the contents of samp.
}
Теперь, каждый раз, когда вы делаете samp315()
:
eg<-samp315()
mean(eg)
[1] 3.15
eg
[1] 3.0 3.7 3.0 3.7 3.3 3.7 3.3 3.3 4.0 1.0 1.7 3.0 2.0 4.0 3.7 3.7 2.3 3.3 4.0 3.3
Если вам нужен образец другой длины, просто поместите любое число внутри samp315()
. Однако чем больше число, тем больше времени потребуется для поиска образца, который получит желаемое среднее значение.
Вы также можете изменить желаемое среднее значение, установив desmean
, и поиграть с диапазоном, изменив distance
на любое расстояние (+/-) от желаемого среднего значения. По умолчанию n = 20, в диапазоне от 3,149 до 3,151.
Чтобы избежать бесконечного цикла для маловероятных комбинаций n и диапазона, я установил максимум 1 м выборок, после чего функция завершает работу с предупреждением.