Мне нужно написать функцию, включающую подстановку df переменной n
bin. Например, если n
равно 2, то делайте выборку df несколько раз в двух бинах (из первой половины, затем из второй половины). Если n
равно 3, выполните выборку в 3 ячейках (первая 1/3, вторая 1/3, третья 1/3). До сих пор я делал это для разных длин n вручную, и я знаю, что должен быть лучший способ сделать это. Я хочу записать это в функцию с n
в качестве ввода, но пока не могу заставить ее работать. Код ниже.
# create df
df <- data.frame(year = c(1:46),
sample = seq(from=10,to=30,length.out = 46) + rnorm(46,mean=0,sd=2) )
# real df has some NAs, so we'll add some here
df[c(20,32),2] <- NA
Этот показатель составляет 46 лет отбора проб. Я хочу притвориться вместо 46 выборок, я взял только 2, но один случайный год в первой половине (1:23) и один случайный год во второй половине (24:46).
# to subset in 2 groups, say, 200 times
# I'll make a df of elements to sample
samplelist <- data.frame(firstsample = sample(1:(nrow(df)/2),200,replace = T), # first sample in first half of vector
secondsample = sample((nrow(df)/2):nrow(df),200, replace = T) )# second sample in second half of vector
samplelist <- as.matrix(samplelist)
# start a df to add to
plot_df <- df %>% mutate(first='all',
second = 'all',
group='full')
# fill the df using coords from expand.grid
for(i in 1:nrow(samplelist)){
plot_df <<- rbind(plot_df,
df[samplelist[i,] , ] %>%
mutate(
first = samplelist[i,1],
second = samplelist[i,2],
group = i
))
print(i)
}
(Если мы сможем пропустить выборку по годам выборки "NA", это было бы очень хорошо).
Итак, если бы я хотел сделать это для трех точек вместо двух, я бы повторил процесс следующим образом:
# to subset in 3 groups 200 times
# I'll make a df of elements to sample
samplelist <- data.frame(firstsample = sample(1:(nrow(df)/3),200,replace = T), # first sample in first 1/3
secondsample = sample(round(nrow(df)/3):round(nrow(df)*(2/3)),200, replace = T), # second sample in second 1/3
thirdsample = sample(round(nrow(df)*(2/3)):nrow(df), 200, replace=T) # third sample in last 1/3
)
samplelist <- as.matrix(samplelist)
# start a df to add to
plot_df <- df %>% mutate(first='all',
second = 'all',
third = 'all',
group='full')
# fill the df using coords from expand.grid
for(i in 1:nrow(samplelist)){
plot_df <<- rbind(plot_df,
df[samplelist[i,] , ] %>%
mutate(
first = samplelist[i,1],
second = samplelist[i,2],
third = samplelist[i,3],
group = i
))
print(i)
}
, но я хочу сделать это много раз, сэмплирование до ~ 20 раз (то есть в 20 лотках), поэтому этот ручной метод не является устойчивым. Можете ли вы помочь мне написать функцию, которая скажет: «выберите один образец из n корзин x раз»?
Кстати, это график, который я делаю с полным df:
plot_df %>%
ggplot(aes(x=year,y=sample)) +
geom_point(color="grey40") +
stat_smooth(geom="line",
method = "lm",
alpha=.3,
aes(color=group,
group=group),
se=F,
show.legend = F) +
geom_line(color="grey40") +
geom_smooth(data = plot_df %>% filter(group %in% c("full")),
method = "lm",
alpha=.7,
color="black",
size=2,
#se=F,
# fill="grey40
show.legend = F
) +
theme_classic()