Код R для итеративного и случайного удаления целых строк из фрейма данных на основе значения столбца и сохранения каждый раз в виде нового фрейма данных - PullRequest
0 голосов
/ 18 июня 2020

Пожалуйста, простите меня, если этот вопрос задавался раньше!

Итак, у меня есть фреймворк (df) индивидуумов, отобранных из различных популяций, где каждому человеку дано название популяции и соответствующий номер, присвоенный этой популяции как следует:

Individual  Population  Popnum
ALM16-014   AimeesMdw   1
ALM16-024   AimeesMdw   1
ALM16-026   AimeesMdw   1
ALM16-003   AMKRanch    2
ALM16-022   AMKRanch    2
ALM16-075   BearPawLake 3
ALM16-076   BearPawLake 3
ALM16-089   BearPawLake 3

Всего имеется 12 именованных популяций (не все они имеют одинаковое количество особей) с Popnum 1-12 в этом файле. Что мне нужно сделать, так это случайным образом удалить одну или несколько популяций (желательно с использованием столбца Popnum) из фрейма данных и повторить это 100 раз, а затем сохранить каждый результат как отдельный фрейм данных (ie. Df1, df2, df3 и т. Д. c). Конечный результат - 100 dfs, из которых случайным образом удаляется одна популяция. Следующий шаг - повторить это 100 раз, удалив две случайные популяции, затем 3 случайные популяции и т. Д.

Любая помощь будет принята с благодарностью !!

1 Ответ

0 голосов
/ 18 июня 2020

Вы можете написать функцию, которая принимает фрейм данных в качестве входных данных и n, т.е. количество Popnum для удаления.

remove_n_Popnum <- function(data, n) {
   subset(data, !Popnum %in% sample(unique(Popnum), n))
}

Чтобы получить один popnum, вы можете:

remove_n_Popnum(df, 1)

#  Individual Population Popnum
#1  ALM16-014  AimeesMdw      1
#2  ALM16-024  AimeesMdw      1
#3  ALM16-026  AimeesMdw      1
#4  ALM16-003   AMKRanch      2
#5  ALM16-022   AMKRanch      2

Чтобы сделать это 100 раз, вы можете использовать replicate

list_data <- replicate(100, remove_n_Popnum(df1, 1), simplify = FALSE)

Чтобы передать другую n в remove_n_Popnum функцию, вы можете использовать lapply

nested_list_data <- lapply(seq_along(unique(df$Popnum)[-1]), 
          function(x) replicate(100, remove_n_Popnum(df, x), simplify = FALSE))

, где seq_along генерирует последовательность, которая на 1 меньше количества уникальных значений.

seq_along(unique(df$Popnum)[-1])
#[1] 1 2
...