Выборка случайных строк в кадре данных

190

Я изо всех сил пытаюсь найти соответствующую функцию, которая возвращала бы определенное количество строк, выбранных случайным образом без замены из фрейма данных на языке R? Может ли кто-нибудь помочь мне?

Теги:
dataframe
sample
r-faq

7 ответов

273
Лучший ответ

Сначала сделайте несколько данных:

> 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
  • 4
    @nikhil Смотрите здесь и здесь для начала. Вы также можете набрать ?sample в консоли R, чтобы прочитать об этой функции.
  • 8
    Может кто-нибудь объяснить, почему sample (df, 3) не работает? Зачем вам нужен df [sample (nrow (df), 3),])?
Показать ещё 6 комментариев
83

Ответ Джон Колби дает правильный ответ. Однако, если вы являетесь пользователем dplyr, есть также ответ sample_n:

sample_n(df, 10)

случайным образом отображает 10 строк из фрейма данных. Он вызывает sample.int, поэтому на самом деле это один и тот же ответ с меньшим набором символов (и упрощает использование в контексте magrittr, поскольку dataframe является первым аргументом).

24

Напишите один! Обертывание ответа JC дает мне:

randomRows = function(df,n){
   return(df[sample(nrow(df),n),])
}

Теперь сделайте это лучше, сначала проверив, если n <= nrow (df) и остановится с ошибкой.

15

В пакете data.table предусмотрена функция DT[sample(.N, M)], выборка из случайных строк из таблицы данных DT.

library(data.table)
set.seed(10)

mtcars <- data.table(mtcars)
mtcars[sample(.N, 6)]

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1: 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
2: 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
3: 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
4: 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
5: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
6: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
7

EDIT: этот ответ устарел, см. обновленную версию.

В мой пакет R У меня есть улучшенный sample, так что он теперь ведет себя так же, как ожидалось, и для фреймов данных:

library(devtools); install_github('kimisc', 'krlmlr')

library(kimisc)
example(sample.data.frame)

smpl..> set.seed(42)

smpl..> sample(data.frame(a=c(1,2,3), b=c(4,5,6),
                           row.names=c('a', 'b', 'c')), 10, replace=TRUE)
    a b
c   3 6
c.1 3 6
a   1 4
c.2 3 6
b   2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6

Это достигнуто, сделав sample общий метод S3 и предоставив необходимую (тривиальную) функциональность в функции. Вызов setMethod устраняет все. К исходной реализации все еще можно получить доступ через base::sample.

  • 1
    Что неожиданного в его обработке кадров данных?
  • 2
    @adifferentben: Когда я вызываю sample.default(df, ...) для фрейма данных df , он выбирает из столбцов фрейма данных, так как фрейм данных реализован в виде списка векторов одинаковой длины.
Показать ещё 8 комментариев
4

В мой пакет R существует функция sample.rows только для этой цели:

install.packages('kimisc')

library(kimisc)
example(sample.rows)

smpl..> set.seed(42)

smpl..> sample.rows(data.frame(a=c(1,2,3), b=c(4,5,6),
                               row.names=c('a', 'b', 'c')), 10, replace=TRUE)
    a b
c   3 6
c.1 3 6
a   1 4
c.2 3 6
b   2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6

Усиление sample, сделав его общей функцией S3, было плохой идеей, согласно комментариям Джориса Мейса к предыдущему ответу .

1

Выберите случайный образец из типа подсвечника в R:

library("tibble")    
a <- your_tibble[sample(1:nrow(your_tibble), 150),]

nrow берет заголовок и возвращает количество строк. Первым параметром, переданным в sample, является диапазон от 1 до конца вашего подсвета. Второй параметр, переданный образцу 150, представляет собой количество случайных выборок, которые вы хотите. Квадратная скобка определяет строки возвращаемых индексов. Значение переменной "a" получает значение случайной выборки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню