R如何从多列表数据结构中提取整数向量

时间:2018-09-06 19:29:28

标签: r list sapply

我正在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 :(得分:2)

这是lapply的一个选项。第一行从您的列表中提取"barcodes",它返回一个列表。

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

现在,当我们从lst的子集(即lst[nums_of_interest]的子集中提取前5个条目时,我们几乎会再次执行相同的操作。

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是一个列表,但是您希望返回一个向量,因此请使用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])))

答案 1 :(得分:1)

使用map

library(purrr)

num_of_interst <- c(1,3)
numbers <- unlist(map(mylist[num_of_interst], ~.[["barcodes"]][1:5]))