Я изо всех сил пытаюсь найти подходящую функцию, которая будет возвращать указанное количество строк, случайно выбранных без замены из фрейма данных на языке R? Может кто-нибудь мне помочь?
333
Сначала сделайте некоторые данные:
> df = data.frame(matrix(rnorm(20), nrow=10))
> df
X1 X2
1 0.7091409 -1.4061361
2 -1.1334614 -0.1973846
3 2.3343391 -0.4385071
4 -0.9040278 -0.6593677
5 0.4180331 -1.2592415
6 0.7572246 -0.5463655
7 -0.8996483 0.4231117
8 -1.0356774 -0.1640883
9 -0.3983045 0.7157506
10 -0.9060305 2.3234110
Затем выберите несколько строк случайным образом:
> df[sample(nrow(df), 3), ]
X1 X2
9 -0.3983045 0.7157506
2 -1.1334614 -0.1973846
10 -0.9060305 2.3234110
?sample
в консоли R, чтобы прочитать об этой функции.set.seed(42)
) каждый раз, когда вы хотите воспроизвести этот конкретный образец.sample.int
было бы немного быстрее, я верю:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
Джон Колби дает правильный ответ. Однако, если вы являетесь
dplyr
пользователем, есть ответsample_n
:случайным образом выбирает 10 строк из кадра данных. Он вызывает
sample.int
, так что на самом деле это тот же ответ с меньшим набором текста (и упрощает использование в контексте magrittr, так как датафрейм является первым аргументом).источник
Напиши один! Заключение ответа JC дает мне:
Теперь сделайте это лучше, проверив сначала, если n <= nrow (df) и остановившись с ошибкой.
источник
data.table
Пакет предоставляет функциюDT[sample(.N, M)]
, выборки М случайных строк из таблицы данныхDT
.источник
Просто ради полноты:
dplyr также предлагает нарисовать пропорцию или долю
Это очень удобно, например, в машинном обучении, когда нужно выполнить определенный коэффициент разделения, например, 80%: 20%.
источник
РЕДАКТИРОВАТЬ : Этот ответ устарел, см. Обновленную версию .
В моем пакете R я улучшил его
sample
так, что теперь он ведет себя, как и ожидалось, также для фреймов данных:Это достигается созданием
sample
универсального метода S3 и предоставлением необходимой (тривиальной) функциональности в функции. ПризывsetMethod
исправить все. Оригинальная реализация все еще может быть доступна черезbase::sample
.источник
sample.default(df, ...)
фрейм данныхdf
, он выбирает из столбцов фрейма данных, так как фрейм данных реализован в виде списка векторов одинаковой длины.install_github('kimisc', 'krlmlr')
и получилError: Does not appear to be an R package (no DESCRIPTION)
. Любой способ обойти это?[
Оператор кадров данных контрпример. Также, пожалуйста, скажите мне: Вы когда-нибудь, только один раз, использовалиsample
для выборки столбцов из фрейма данных?iris[2]
работает как список, как иiris[[2]]
. Илиiris$Species
,lapply(iris, mean)
... Кадры данных являются списками. Поэтому я ожидаю, что они будут вести себя как они. И да, я действительно использовал образец (myDataframe). В наборе данных, где каждая переменная содержит данные экспрессии одного гена. Ваш конкретный метод помогает начинающим пользователям, но также эффективно меняетsample()
поведение. Обратите внимание, я использую «как ожидалось» с точки зрения программиста. Что отличается от общей интуиции. В R много чего не совместимо с общей интуицией ...;)В моем пакете R есть функция как
sample.rows
раз для этой цели:sample
Согласно комментариям Йориса Мейс к предыдущему ответу, усовершенствование , сделав его универсальной функцией S3, было плохой идеей .источник
Выберите случайную выборку из типа tibble в R:
Nrow берет tibble и возвращает количество строк. Первый передаваемый параметр
sample
- это диапазон от 1 до конца вашего шага. Второй параметр, переданный в выборку, 150, это сколько случайных выборок вы хотите. Нарезка квадратной скобкой указывает строки возвращаемых индексов. Переменная 'a' получает значение случайной выборки.источник
Вы могли бы сделать это:
Выше я только что создал фрейм данных с 10 столбцами и 100 строками, хорошо?
Теперь вы можете попробовать это
sample_n
:источник
Я новичок в R, но я использовал этот простой метод, который работает для меня:
PS: не стесняйтесь заметить, если у него есть какой-то недостаток, о котором я не думаю.
источник
Вы могли бы сделать это:
источник