Пример n случайных строк для каждой группы в кадре данных

Из этих вопросов – случайная выборка строк из подмножества R-кадра данных и выборочные случайные строки в фрейме данных. Я могу легко увидеть, как случайным образом выбирать (выбирать) «n» строки из строк df или «n», которые исходят из определенного уровня коэффициента внутри df.

Вот несколько примеров данных:

df <- data.frame(matrix(rnorm(80), nrow=40)) df$color <- rep(c("blue", "red", "yellow", "pink"), each=10) df[sample(nrow(df), 3), ] #samples 3 random rows from df, without replacement. 

Например, например, образец 3 случайных строк из «розового» цвета – с использованием library(kimisc) :

 library(kimisc) sample.rows(subset(df, color == "pink"), 3) 

или написание пользовательской функции:

 sample.df <- function(df, n) df[sample(nrow(df), n), , drop = FALSE] sample.df(subset(df, color == "pink"), 3) 

Тем не менее, я хочу отбирать 3 (или n) случайные строки с каждого уровня фактора. Т.е. новый df будет иметь 12 рядов (3 от синего, 3 от красного, 3 от желтого, 3 от розового). Очевидно, что можно запускать это несколько раз, создавать newdfs для каждого цвета, а затем связывать их вместе, но я ищу более простое решение.

Вы можете назначить случайный идентификатор для каждого элемента, который имеет определенный факторный уровень, используя ave . Затем вы можете выбрать все случайные идентификаторы в определенном диапазоне.

 rndid <- with(df, ave(X1, color, FUN=function(x) {sample.int(length(x))})) df[rndid<=3,] 

Это имеет то преимущество, что вы сохраняете исходные строки и имена строк, если это то, что вас интересует. Кроме того, вы можете повторно использовать вектор rndid для создания подмножества разной длины довольно легко.

В версиях dplyr 0.3 и более поздних версий это прекрасно работает:

 df %>% group_by(color) %>% sample_n(size = 3) 

Старые версии dplyr (версия <= 0.2)

Я решил ответить на это с помощью dplyr , предполагая, что это сработает:

 df %.% group_by(color) %.% sample_n(size = 3) 

Но оказывается, что в 0.2 метод sample_n.grouped_df S3 существует, но не зарегистрирован в файле NAMESPACE, поэтому он никогда не отправляется. Вместо этого я должен был сделать это:

 df %.% group_by(color) %.% dplyr:::sample_n.grouped_df(size = 3) Source: local data frame [12 x 3] Groups: color X1 X2 color 8 0.66152710 -0.7767473 blue 1 -0.70293752 -0.2372700 blue 2 -0.46691793 -0.4382669 blue 32 -0.47547565 -1.0179842 pink 31 -0.15254540 -0.6149726 pink 39 0.08135292 -0.2141423 pink 15 0.47721644 -1.5033192 red 16 1.26160230 1.1202527 red 12 -2.18431919 0.2370912 red 24 0.10493757 1.4065835 yellow 21 -0.03950873 -1.1582658 yellow 28 -2.15872261 -1.5499822 yellow 

Предположительно это будет исправлено в будущем обновлении.

Я бы рассмотрел мою stratified функцию , которая в настоящее время размещается как GitHub Gist.

Получите это с помощью:

 library(devtools) ## To download "stratified" source_gist("https://gist.github.com/mrdwab/6424112") 

И используйте его с:

 stratified(df, "color", 3) 

Существует несколько различных функций, которые удобны для стратифицированной выборки. Например, вы также можете взять образец «на лету».

 stratified(df, "color", 3, select = list(color = c("blue", "red"))) 

Чтобы дать вам представление о том, что делает функция, вот аргументы для stratified :

  • df : входные data.frame
  • group : символьный вектор столбца или столбцов, составляющих «страты».
  • size : желаемый размер выборки.
    • Если size – это значение меньше 1, из каждой страты берется пропорциональная выборка.
    • Если size представляет собой одно целое число от 1 или более, это количество выборок берется из каждой страты.
    • Если size представляет собой вектор целых чисел, указанное количество выборок берется для каждой страты. Рекомендуется использовать именованный вектор . Например, если у вас есть две страты, «A» и «B», и вам нужно 5 образцов из «A» и 10 из «B», вы должны ввести size = c(A = 5, B = 10) .
  • select : Это позволяет вам подмножать группы в процессе выборки. Это list . Например, если ваша group переменная была «Group», и она содержала три страты: «A», «B» и «C», но вы хотели только попробовать с «A» и «C», вы можете использовать select = list(Group = c("A", "C")) .
  • replace : для отбора проб с заменой.

Вот решение. Мы разделили data.frame на группы цветов. Из каждой такой группы мы выбираем 3 строки. В результате мы получаем список data.frames.

 df2 <- lapply(split(df, df$color), function(subdf) subdf[sample(1:nrow(subdf), 3),] ) 

Затем список data.frames должен быть объединен в 1 data.frame:

 do.call('rbind', df2) ## X1 X2 color ## blue.3 -1.22677188 1.25648082 blue ## blue.4 -0.54516686 -1.94342967 blue ## blue.1 0.44647071 0.16283326 blue ## pink.40 0.23520296 -0.40411906 pink ## pink.34 0.02033939 -0.32321309 pink ## pink.33 -1.01790533 -1.22618575 pink ## red.16 1.86545895 1.11691250 red ## red.11 1.35748078 -0.36044728 red ## red.13 -0.02425645 0.85335279 red ## yellow.21 1.96728782 -1.81388110 yellow ## yellow.25 -0.48084967 0.07865186 yellow ## yellow.24 -0.07056236 -0.28514125 yellow 

В основе лежит способ, который позволяет использовать несколько групп и выборку с заменой:

 n <- 3 resample <- TRUE index <- 1:nrow(df) fun <- function(x) sample(x, n, replace = resample) a <- aggregate(index, by = list(group = df$color), FUN = fun ) df[c(a$x),] 

Чтобы добавить другую группу, включите ее в аргумент 'by' для агрегирования.

  • Есть ли способ доступа к базовому контейнеру контейнеров-контейнеров STL?
  • Могу ли я иметь несколько первичных ключей в одной таблице?
  • Хранимые процедуры MySQL используют их или не используют
  • ДО и DONT для индексов
  • В чем разница между каталогом и схемой в реляционной базе данных?
  • do.call (rbind, list) для нечетного числа столбцов
  • Каков наиболее эффективный способ хранения тегов в базе данных?
  • Лучший способ хранения данных локально в .NET (C #)
  • Нужна помощь в разработке логики БД
  • Обнаружение пикового сигнала в реальном времени
  • Пользовательские изображения - firebase database и хранилище файловой системы
  • Interesting Posts

    В Java, когда я должен создать проверенное исключение и когда это должно быть исключение во время выполнения?

    Как разрешить отказ доступа к собственному многопользовательскому программному обеспечению на подключенном или общем сетевом диске в Windows 7?

    System.BadImageFormatException: не удалось загрузить файл или сборку (из installutil.exe)

    Удаленный конструктор по умолчанию. Объекты все еще могут быть созданы … иногда

    Не игнорирует ли MySQL нулевые значения по уникальным ограничениям?

    C #: создание унаследованного события

    Чистая реализация Java / JSF для двойного представления

    Распознавание лиц в Android?

    умные указатели (boost) объяснили

    PHP не работает над новой установкой

    Существует ли версия ОС Windows, которая позволит загрузочному диску превышать 2 ТБ?

    С Bash Scripting, как я могу подавить весь вывод из команды?

    Word 2010 Количество страниц без первой страницы

    Пакет Sniff через Wi-Fi

    Установка принтера HomeGroup

    Давайте будем гением компьютера.