如何解决R - 通过嵌套列表的参数对列表进行子集化
我有一个包含嵌套列表的列表 request.onload
。
我想根据指定的参数选择特定子集的子集或创建一个新列表,详细信息如下:
list_tot
内容如下:
List_1 <- list(a = matrix(5,2),b = matrix(5,7),c = matrix(5,9),d = matrix(5,3))
List_2 <- list(a = matrix(7,3),b = matrix(7,c = matrix(7,1),d = matrix(7,9))
List_3 <- list(a = matrix(5,3))
List_4 <- list(a = matrix(5,3))
List_5 <- list(a = matrix(5,3))
List_tot <- list(List_1,List_2,List_3,List_4,List_5)
我要选择:
- 对于每个嵌套列表,仅选择列表/矩阵 a、c 和 d。
- 为每个嵌套列表选择行数最多的两个列表/矩阵。
所以 [[1]]
[[1]]$a
[,1]
[1,] 5
[2,] 5
[[1]]$b
[,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[[1]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[1]]$d
[,] 5
[[2]]
[[2]]$a
[,] 7
[2,] 7
[3,] 7
[[2]]$b
[,] 7
[4,] 7
[5,] 7
[6,] 7
[7,] 7
[[2]]$c
[,] 7
...etc
的输出为:
内容如下:
New_List_tot
任何帮助都会有所帮助。我所有的尝试,尝试使用 plyer 和 dplyr,但没有成功并且非常卡住。
解决方法
我们可以使用 base R
来做到这一点。不需要任何包
lapply(List_tot,`[`,c("a","c","d"))
或匿名函数
lapply(List_tot,function(x) x[c("a","d")])
如果我们需要前 2 个,order
行数(lengths
工作,因为这些是单列 matrix
,所以行数等于元素总数,获取行数有序向量的 head
的 names
并使用它来提取内部列表元素
lapply(List_tot,function(x) {
x1 <- x[c("a","d")]
v1 <- lengths(x1)
x1[head(names(v1)[order(-v1)],2)]
})
,
更新
对于第二个目标,您可以尝试
lapply(
List_tot,function(lst) {
head(lst[c("a","d")][order(-sapply(lst[c("a","d")],nrow))],2)
}
)
给出
[[1]]
[[1]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[1]]$d
[,1]
[1,] 5
[2,] 5
[3,] 5
[[2]]
[[2]]$d
[,] 7
[2,] 7
[3,] 7
[4,] 7
[5,] 7
[6,] 7
[7,] 7
[8,] 7
[9,] 7
[[2]]$a
[,] 7
[2,] 7
[3,] 7
[[3]]
[[3]]$c
[,] 5
[[3]]$d
[,] 5
[[4]]
[[4]]$c
[,] 5
[[4]]$d
[,] 5
[[5]]
[[5]]$c
[,] 5
[[5]]$d
[,] 5
- 对于您的第一个目标,“对于每个嵌套列表,仅选择列表/矩阵 a、c 和 d。”
lapply(List_tot,"d"))
- 对于您的第二个目标,“为每个嵌套列表选择行数最多的列表/矩阵。”
Map(`[`,List_tot,max.col(t(sapply(List_tot,lengths))))
,
在基础 R 中,您可以:
lapply(List_tot,function(x) (y<-x[c("a","d")])[order(sapply(y,nrow),decreasing = TRUE)[1:2]])
[[1]]
[[1]]$c
[,] 5
etc
,
@akrun 对第 1 步有一个清晰的答案,按列过滤。对于第 2 步,您可以尝试按行数过滤
library(magrittr)
List_colfilter <- lapply(List_tot,function(i)i[c("a","d")])
longestlist <- function(l){
maxr <- lapply(l,nrow) %>% unlist %>% max
l2 <- lapply(l,function(x) if(nrow(x)==maxr) x else NA)
for (n in names(l)){
if (is.na(l2[n])){
l2[n] <- NULL
}
}
return(l2)
}
List_longfilter <- lapply(List_colfilter,longestlist)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。