Перестановка строк данных в зависимости от фактора - PullRequest
0 голосов
/ 18 января 2019

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

letter class value
     A     0    55
     B     1    23
     C     1    12
     D     1     9
     E     2    68
     F     2    78
     G     2   187

Я хочу сделать случайную выборку строк в каждом классе, чтобы связать letter с новым случайным value (но из того же класса).

Требуемый пример вывода:

letter class value
     A     0    55
     B     1    12
     C     1     9
     D     1    23
     E     2   187
     F     2    78
     G     2    68

Я пробовал что-то с dplyr вроде:

tab %>% group_by(class) %>% sample_n(size=3)

Но в этом примере 3 строки на группу, и у меня не одинаковое количество значений на группу.

Единственное решение, которое я нашел на данный момент, - это создание n фреймов данных для каждого класса и независимое перемешивание каждого фрейма данных. Но так как мой номер класса большой, он может быть слишком длинным и грязным.

1 Ответ

0 голосов
/ 18 января 2019

Мы можем использовать sample в последовательности строк (row_number()) и переставить «значение» на основе выборочного индекса

df1 %>% 
  group_by(class) %>% 
  mutate(value = value[sample(row_number())]) 

Или, как упоминалось в комментариях @RonakShah, если у нас есть только одна строка, то использование sample вызовет sample последовательности значений. Таким образом, если мы непосредственно используем sample для 'значения', тогда можно использовать условие if/else

df1 %>% 
  group_by(class) %>%
  mutate(value = if(n() == 1) value else sample(value, n()))

Если мы хотим использовать sample_n, это можно сделать в do

df1 %>% 
   group_by(class) %>%
   do(sample_n(., size = nrow(.)))

ПРИМЕЧАНИЕ. Нам нужно указать nrow вместо n(), так как некоторые специфические функции приведения в движение работают внутри определенных функций, таких как mutate/fsummarise/filter/arrange и т. Д., Но не реализованы для работы вместе с sample_n

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...