R - Как повторить манипуляции с фреймом данных 100x с новыми случайными числами и удалением графика

Я новый пользователь R и пытаюсь создать несколько подвыборок фрейма данных. У меня есть данные, назначенные для 4 слоя (STRATUM = 1, 2, 3, 4), и я хочу, чтобы в случайном порядке оставалось только определенное количество строк в каждом слое. Чтобы добиться этого, я импортирую свои данные, сортирую по значению стратификации, затем присваиваю случайное число каждой строке. Я хочу сохранить исходные назначения случайных чисел, так как мне нужно использовать их снова в будущих анализах, поэтому я сохраняю.csv с этими значениями. Затем я подстраиваю данные под их страты, а затем указываю количество записей, которые я хочу сохранить в каждой страте. Наконец, я возвращаюсь к данным и сохраняю их как новый.csv. Код работает, однако я хочу повторить этот процесс 100 раз. В каждом случае я хочу сохранить.csv с назначенными случайными числами, а также окончательный.csv случайно выбранных графиков. Я не уверен, как заставить этот блок кода повторяться 100 раз, а также как назначить уникальное имя файла для каждой итерации. Любая помощь приветствуется.

DataFiles <- "//Documents/flownData_JR.csv"
PlotsFlown <- read.table (file = DataFiles, header = TRUE, sep = ",")
#Sort the data by the stratification
FlownStratSort <- PlotsFlown[order(PlotsFlown$STRATUM),]
#Create a new column with a random number (no duplicates)
FlownStratSort$RAND_NUM <- sample(137, size = nrow(FlownStratSort), replace = FALSE)
#Sort by the stratum, then random number
FLOWNRAND <- FlownStratSort[order(FlownStratSort$STRATUM,FlownStratSort$RAND_NUM),]
#Save a csv file with the random numbers
write.table(FLOWNRAND, file = "//Documents/RANDNUM1_JR.csv", sep = ",", row.names = FALSE, col.names = TRUE)
#Subset the data by stratum
FLOWNRAND1 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='1'),]
FLOWNRAND2 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='2'),]
FLOWNRAND3 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='3'),]
FLOWNRAND4 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='4'),]
#Remove data from each stratum, specifying the number of records we want to retain
FLOWNRAND1 <- FLOWNRAND1[1:34, ]
FLOWNRAND2 <- FLOWNRAND2[1:21, ]
FLOWNRAND3 <- FLOWNRAND3[1:7, ]
FLOWNRAND4 <- FLOWNRAND4[1:7, ]
#Rejoin the data
FLOWNRAND_uneven <- rbind(FLOWNRAND1, FLOWNRAND2, FLOWNRAND3, FLOWNRAND4)
#Save the table with plots removed from each stratum flown in 2017
write.table(FLOWNRAND_uneven, file = "//Documents/Flown_RAND_uneven_JR.csv", sep = ",", row.names = FALSE, col.names = TRUE)

1 ответ

Вот data.table решение, если вам просто нужно знать, какие строки в каждом наборе.

library(data.table)
df <- data.table(dat = runif(100), 
                 stratum = sample(1:4, 100, replace = T))

# Gets specified number randomly from each strata
get_strata <- function(df, n, i){
  # Subset data frame to randomly chosen w/in strata
  # replace stratum with var name
  f <- df[df[, .I[sample(.N, n)], by = stratum]$V1]

  # Save as CSV, replace path
  write.csv(f, file = paste0("path/df_", i), 
            row.names = F, col.names = T)
}

for (i in 1:100){
  # replace 10 with number needed
  get_strata(df, 10, i)
}
Другие вопросы по тегам