Произвольно выбирайте строки из фрейма данных на основе значения столбца

#r #dataframe #function #random #dplyr

Вопрос:

Мне было интересно, есть ли способ заставить мои expand.grid() выходные данные отображать неравные строки для каждого уникального study значения (в настоящее время каждое уникальное study значение имеет 4 строки)?

Например, можем ли мы случайным образом выбрать некоторые или все строки study == 1 , некоторые или все строки study == 2 и некоторые или все строки study == 3 ?

Количество строк, выбранных из каждого исследования, является абсолютно случайным.

Это игрушечное исследование, приветствуется функциональный ответ.

 library(dplyr)
(data <- expand.grid(study = 1:2, outcome = rep(1:2,2)))
arrange(data, study, outcome)
#   study outcome
#1      1       1
#2      1       1
#3      1       2
#4      1       2 #--- Up to here study == 1
#5      2       1
#6      2       1
#7      2       2
#8      2       2 #--- Up to here study == 2
#9      3       1
#10     3       1
#11     3       2
#12     3       2 #--- Up to here study == 3                      
 

Комментарии:

1. Как вы определяете случайность для каждого study из них ? Можете ли вы показать некоторые примеры входных данных и соответствующие выходные данные для функции, которую вы ожидаете?

2. @RonakShah, это тоже случайность. Вы можете выбрать все строки или несколько существующих строк исследования.

Ответ №1:

Вы можете sample n() для каждого study и выбрать 1 случайное значение.

 library(dplyr)

data %>% group_by(study) %>% sample_n(sample(n(), 1)) %>% ungroup
 

Комментарии:

1. Похоже, жизненный цикл sample_n() семьи был заменен. Можем ли мы использовать slice_sample() вместо этого?

2. Нет. slice_sample необходимо n или prop должно быть исправлено, и они не могут быть динамичными в разных группах. Я поднял вопрос в прошлом году github.com/tidyverse/dplyr/issues/5478 об этом, но у dplyr разработчиков на этот счет другое мнение.

Ответ №2:

Если я правильно понял, это должно сработать

 data %>% 
  #Grouping by the variable study
  group_by(study) %>% 
  #Sampling 3 observations for each study
  sample_n(size = 3)