R - Создать случайные подвыборки размера n для нескольких групп выборок. - PullRequest
0 голосов
/ 24 октября 2018

У меня есть большой набор данных выборок, которые принадлежат к разным группам и отличаются по охватываемой области.Структура набора данных упрощена ниже.Теперь я хотел бы создать объединенные выборки (подгруппы) для каждой группы, где область, охватываемая каждой подгруппой, равна определенной области (например, 20).Образцы должны быть распределены случайным образом и без замены для каждой подгруппы, а номер подгруппы должен быть указан в новом столбце в конце фрейма данных.

SampleID Group Area Subgroup
1          A  1.5        1
2          A  3.8        2
3          A    6        4
4          A  1.9        1
5          A  1.5        3
6          A  4.1        1
7          A  3.7        1
8          A  4.5        3
...                 
300        B  1.2        1
301        B  3.8        1
302        B  4.1        4
303        B  2.6        3
304        B  3.1        5
305        B  3.5        3
306        B  2.1        2
...     
2000       S  2.7        5
...

В настоящее время я использую команду 'cumsum' для создания подгрупп, используя приведенный ниже код.

dat <- read.table("Pooling_Test.txt", header = TRUE, sep = "\t")
dat$CumArea <- cumsum(dat$Area) 
dat$Diff_CumArea <- c(0, head(cumsum(dat$Area), -1)) 
dat$Sample_Int_1 <- "0"
dat$Sample_End <- "0" 
current.sum <- 0 

for (c in 1:nrow(dat)) {
  current.sum <- current.sum + dat[c, "Area"]
  dat[c, "Diff_CumArea"] <- current.sum  
  if (current.sum >= 20) {
    dat[c, "Sample_Int_1"] <- "1"
    dat[c, "Sample_End"] <- "End"
    current.sum <- 0
dat$Sample_Int_2 <- cumsum(dat$Sample_Int_1)+1
dat$Sample_Final <- dat$Sample_Int_2
for (d in 1:nrow(dat)) {
  if (dat$Sample_End[d] == 'End')
    dat$Subgroup[d] <- dat$Sample_Int_2[d]-1  
  else 0 }
}}

write.csv(dat, file = 'Pooling_Test_Output.csv', row.names = FALSE)

Результирующий фрейм данных показывает, что я хочу (см. Ниже).Однако есть пара шагов, которые я хотел бы улучшить.Во-первых, у меня проблемы с включением команды для случайного выбора выборок из каждой группы, поэтому в настоящее время я рандомизирую порядок выборок перед загрузкой фрейма данных в R. Во-вторых, в выходной таблице подгруппы нумеруются последовательно, но я хотел бы начатьнумерация подгрупп с 1 для каждой новой группы.Есть ли у кого-нибудь совет, как этого добиться?

SampleID    Group       CumArea     Subgroups
    1         A           1.5       1
   77         A           4.6       1
    6         A           9.3       1
   43         A          16.4       1
   17         A          19.5       1
   67         A           2.1       2
    4         A           4.3       2
   32         A           8.9       2
  ...         
  300         B           4.5       10
  257         B           6.8       10
  397         B          10.6       10
  344         B          14.5       10
  367         B          16.7       10
  303         B          20.1       10
  306         B           1.5       11
  ...

1 Ответ

0 голосов
/ 24 октября 2018

Несколько функций в пакете dplyr делают это довольно просто.Вы можете использовать slice для рандомизации данных, group_by для выполнения вычислений на уровне группы и mutate для создания новых переменных.Если вы объедините функции в цепочку вместе с оператором %>%, я думаю, что решение будет выглядеть примерно так, при условии, что вы хотите, чтобы группы добавляли до 20.

install.packages("dplyr") #If you haven't used dplyr before
library(dplyr)    

dat %>%
  group_by(Group) %>%
  slice(sample(1:n())) %>%
  mutate(CumArea = cumsum(Area), SubGroup = ceiling(CumArea / 20))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...