R автоматически называет результаты цикла - PullRequest
0 голосов
/ 07 октября 2019

У меня есть список фреймов данных:

df_DJF = data.frame(replicate(2,sample(0:130,30,rep=TRUE)))
df_JJA = data.frame(replicate(2,sample(0:130,20,rep=TRUE)))
df_MAM = data.frame(replicate(2,sample(0:130,25,rep=TRUE)))
df_SON = data.frame(replicate(2,sample(0:130,15,rep=TRUE)))

df_list = list(df_DJF, df_JJA, df_MAM, df_SON)

Я хочу произвольно выбрать 80% каждого фрейма данных. Я могу сделать это вручную, выполнив это и используя sample_size в качестве индекса строки.

sample_size = floor(0.8*nrow(df_DJF))
picked_DJF = sample(seq_len(nrow(df_DJF)), size = sample_size)

Моя проблема в том, что у меня очень много df с разным количеством строк. Поэтому я хочу автоматизировать этот процесс. В конце я хочу иметь 4 размера выборки с правильным номером. Имена sample_sizes должны быть следующими:

samplenames = paste("sample_size", c("DJF", "JJA", "MAM", "SON"), sep = "_")

То же самое для "selected" ... это должно быть pick_DJF и так далее ...

1 Ответ

2 голосов
/ 07 октября 2019

Продолжайте использовать списки, а не 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
...