Извлечение и систематизация данных из поднастроенных списков на R - PullRequest
1 голос
/ 29 марта 2020

Последние дни я пытался решить самостоятельно, используя несколько различных источников информации, включая другие вопросы здесь, в Stackoverflow, но не смог. Я начинающий, поэтому, наверное, поэтому я так много с этим борюсь.

Я создал эти фиктивные данные ниже, чтобы проиллюстрировать, как выглядят мои исходные данные.

list1<-list(path = ".../folder1/folder2/Country_State_Species_Individual1.png",
            matrix1 = cbind(1:3, 1:9),
            matrix2 = cbind(1:3, 1:9),
            matrix3 = cbind(1:3, 1:9))

list2<-list(path = ".../folder1/folder2/Country_State_Species_Individual2.png",
            matrix1 = cbind(1:3, 1:9),
            matrix2 = cbind(1:3, 1:9),
            matrix3 = cbind(1:3, 1:9))

list3<-list(path = ".../folder1/folder2/Country_State_Species_Individual3.png",
            matrix1 = cbind(1:3, 1:9),
            matrix2 = cbind(1:3, 1:9),
            matrix3 = cbind(1:3, 1:9))

general_list <- list(list1, list2, list3)

Как видите, это большой список (general_list), состоящий из небольших списков (list1, list2, list3), которые идентичны по структуре.

Моя первоначальная цель может быть описана в два этапа:

1 - выборка 6 случайных строк из каждой матрицы2 и сохранение каждого из этих выходов в новом объекте.

2 - переименование этих объектов используя информацию, содержащуюся в исходном имени файла, хранящемся в path

Я хочу переименовать извлеченные матрицы таким образом, потому что мне нужно иметь возможность сортировать матрицы по переменным, выраженным в файле имена (страна, штат и особенно физические лица). Но, возможно, может быть более эффективный / практичный способ сделать это.

Наиболее рекомендуемый способ хранения этих новых объектов будет в новом списке?

Я бы хотел также буду рад получить любые предложения о том, как достичь моей первоначальной цели и как действовать, чтобы оптимизировать хранение этих новых объектов (имея в виду, что они будут использоваться в некотором анализе после того, как все будет сделано).

С наилучшими пожеланиями!

1 Ответ

0 голосов
/ 29 марта 2020

Мы l oop над 'general_list', извлекаем matrix2, затем выбираем 6 строк из набора данных, создаем новый list ('out') и переименовываем list с помощью basename элемента 'path'

out <- lapply(general_list, function(x) {
     x1 <- x$matrix2
     x1[sample(nrow(x1), 6, replace = FALSE),] })
names(out) <- sapply(general_list,
     function(x) tools::file_path_sans_ext(basename(x$path)))
out
#$Country_State_Species_Individual1
#     [,1] [,2]
#[1,]    3    9
#[2,]    2    2
#[3,]    1    7
#[4,]    1    4
#[5,]    3    6
#[6,]    2    8

#$Country_State_Species_Individual2
#     [,1] [,2]
#[1,]    3    3
#[2,]    1    7
#[3,]    3    9
#[4,]    2    2
#[5,]    3    6
#[6,]    1    1

#$Country_State_Species_Individual3
#     [,1] [,2]
#[1,]    3    3
#[2,]    2    2
#[3,]    1    4
#[4,]    2    5
#[5,]    1    7
#[6,]    3    6

Или используя tidyverse

library(dplyr)
library(purrr)
out <- map(general_list, ~  .x %>%
                             pluck('matrix2') %>%
                             as.data.frame %>%
                             sample_n(6) %>%
                             as.matrix)
names(out) <- map_chr(general_list, ~ 
               tools::file_path_sans_ext(basename(.x$path)))
...