Продолжайте использовать списки, а не assign
. Задайте names(df_list) = c("DJF", "JJA", "MAM", "SON")
, затем используйте те же имена для последующих списков, например, список picked
.
# for a single sample size
picked = lapply(df_list, function(x) x[sample(1:nrow(x), size = floor(0.8 * nrow(x))), ])
Использование lapply
сохранит имена исходного списка, поэтому вам не придетсябеспокоиться об этом.
Для нескольких размеров выборки из каждого из фреймов данных вы можете создать вложенный список с вложенным lapply
:
names(df_list) = c("DJF", "JJA", "MAM", "SON")
sample_prop = list(s1 = 0.2, s2 = 0.4, s3 = 0.6, s4 = 0.8)
picked = lapply(df_list, function(df) lapply(sample_prop, function(sp) {
df[sample(nrow(df), size = floor(sp * nrow(df))), ]
}))
# then access individual data frames with `$` or `[[`
picked$JJA$s3
# X1 X2
# 17 70 128
# 7 94 121
# 1 57 125
# 8 32 75
# 9 15 8
# 19 58 15
# 20 55 17
# 10 42 15
# 4 51 67
# 12 89 13
# 2 74 50
# 14 77 36
Чтобы разделить фрейм данных на«выбрал» и «не выбрал», split
имеет смысл. Он уже возвращает list
. Это даст результат тройного вложенного списка:
result = lapply(df_list, function(df) lapply(sample_prop, function(sp) {
n_pick = floor(sp * nrow(df))
n_unpick = nrow(df) - n_pick
split(df, f = c(rep("picked", n_pick), rep("unpicked", n_unpick))[sample(nrow(df))])
}))
result$JJA$s3$unpicked
# X1 X2
# 2 74 50
# 3 62 78
# 4 51 67
# 6 103 42
# 7 94 121
# 11 59 60
# 14 77 36
# 16 83 72