Функцию split
можно использовать для разделения ваших данных на список пластин по 96 элементов в каждой.После того, как это будет сделано, вы можете соответствующим образом сформировать каждый отдельный вектор пластины в матрицу:
# example data
ids = paste0(LETTERS, 1 : 1000)
# Ensure that IDs fit evenly into 96 well plates and fill potential
# empty wells with dummy data.
if (length(ids) %% n != 0L) {
ids = c(ids, rep('', n - length(ids) %% n))
}
# Which plate (1 … number of plates) does each ID belong to?
plate_ids = (seq_along(ids) - 1L) %/% n + 1L
plates = lapply(
split(ids, plate_ids),
matrix,
nrow = nrow,
dimnames = list(LETTERS[seq_len(nrow)], seq_len(n %/% nrow))
)
При этом подумайте, является ли список матриц наиболее удобным форматом для работы: он может бытьлучше иметь массив многомерных идентификаторов;или просто data.frame (с дополнительной информацией, такой как интенсивность или другое измерение для каждой лунки).
Для создания трехмерного массива пластин достаточно следующего кода:
dim = c(nrow, n %/% nrow, length(ids) %/% n)
dimnames = list(LETTERS[seq_len(nrow)], seq_len(n %/% nrow), NULL)
plates = array(ids, dim = dim, dimnames = dimnames)
… при условии, что ids
уже был дополнен до кратного 96, как в моем коде выше.