R Как извлечь вектор целых чисел из многострочной структуры данных - PullRequest
0 голосов
/ 06 сентября 2018

Я работаю в R, пытаясь извлечь вектор чисел из структуры данных списка. Вот небольшой воспроизводимый пример, который отражает структуру гораздо большего набора данных.

# Create a reproducible example multi-level list structure 
mylist <- list()
mylist$`1` <- c("barcodes","data")
mylist$`2` <- c("barcodes","data")
mylist$`3` <- c("barcodes","data")
mylist$`1`$barcodes <- c(1:50)
mylist$`2`$barcodes <- c(50:200)
mylist$`3`$barcodes <- c(1:200)

Я могу успешно сгенерировать нужные мне данные, которые называются numbers, используя следующую команду. Однако это требует жесткого кодирования каждого интересующего набора данных, который не идеален.

numbers <- c(mylist$`1`$barcodes[1:5],
             mylist$`3`$barcodes[1:5])

#This does achieve the desired result 
#> numbers
#[1] 1 2 3 4 5 1 2 3 4 5

Я пытаюсь сделать это с высокой пропускной способностью без жесткого кодирования. Ниже моя попытка.

nums_of_interest <- c(1,3)
numbers <- c(gsub(" ", "", paste("mylist$'",nums_of_interest,"'$barcodes[1:5]")))

# This does not achieve the desired result
#> numbers
#[1] "mylist$'1'$barcodes[1:5]" "mylist$'3'$barcodes[1:5]"

Я пытаюсь найти способ извлечь интересующие числа 1 2 3 4 5 1 2 3 4 5, представляющие интерес, с высокой пропускной способностью.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

С map:

library(purrr)

num_of_interst <- c(1,3)
numbers <- unlist(map(mylist[num_of_interst], ~.[["barcodes"]][1:5]))
0 голосов
/ 06 сентября 2018

Вот один вариант с lapply. Первая строка извлекает "barcodes" из вашего списка, возвращает список.

lst <- lapply(mylist, `[[`, "barcodes")

Теперь мы почти делаем то же самое снова, когда извлекаем первые 5 записей из подмножества lst, то есть из lst[nums_of_interest].

nums_of_interest <- c(1, 3)
(numbers <- lapply(lst[nums_of_interest], `[`, 1:5))
#$`1`
#[1] 1 2 3 4 5
#
#$`3`
#[1] 1 2 3 4 5

Поскольку numbers является списком, но вы хотите, чтобы возвращаемый вектор использовался unlistunname), чтобы получить желаемый результат.

unname(unlist(numbers))
# [1] 1 2 3 4 5 1 2 3 4 5

Или в одну строку с кредитами @ avid_useR

unname(unlist(lapply(mylist[nums_of_interest], function(x) x[['barcodes']][1:5])))
...