R如何从多列表数据结构中提取整数向量
R How to extract vector of integers from multi-list data structure
我在 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
感兴趣的数字。
这是 lapply
的一个选项。第一行从您的列表中提取 "barcodes"
,它 return 是一个列表。
lst <- lapply(mylist, `[[`, "barcodes")
现在,当我们从 lst
的子集中提取前 5 个条目时,我们几乎再次执行相同的操作,即从 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
是一个列表,但您想要 return 中的向量,使用 unlist
(和 unname
)获得所需的输出。
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])))
与map
:
library(purrr)
num_of_interst <- c(1,3)
numbers <- unlist(map(mylist[num_of_interst], ~.[["barcodes"]][1:5]))
我在 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
感兴趣的数字。
这是 lapply
的一个选项。第一行从您的列表中提取 "barcodes"
,它 return 是一个列表。
lst <- lapply(mylist, `[[`, "barcodes")
现在,当我们从 lst
的子集中提取前 5 个条目时,我们几乎再次执行相同的操作,即从 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
是一个列表,但您想要 return 中的向量,使用 unlist
(和 unname
)获得所需的输出。
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])))
与map
:
library(purrr)
num_of_interst <- c(1,3)
numbers <- unlist(map(mylist[num_of_interst], ~.[["barcodes"]][1:5]))