У меня есть большой набор данных выборок, которые принадлежат к разным группам и отличаются по охватываемой области.Структура набора данных упрощена ниже.Теперь я хотел бы создать объединенные выборки (подгруппы) для каждой группы, где область, охватываемая каждой подгруппой, равна определенной области (например, 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
...