R-嵌套列表的参数子集列表
我有一个包含嵌套列表的列表 我想子集或创建一个新列表,根据指定的参数选择特定子集,详细信息如下:R-嵌套列表的参数子集列表,r,list,dplyr,plyr,R,List,Dplyr,Plyr,我有一个包含嵌套列表的列表 我想子集或创建一个新列表,根据指定的参数选择特定子集,详细信息如下: 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,7), c = matrix(7,1), d = matrix(7,9)) List_3 <- list(a = matrix(
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,7), c = matrix(7,1), d = matrix(7,9))
List_3 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3))
List_4 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3))
List_5 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3))
List_tot <- list(List_1, List_2, List_3, List_4, List_5)
我想选择:
New\u List\u tot
的输出为:
内容如下:
[[1]]
[[1]]$a
[,1]
[1,] 5
[2,] 5
[[1]]$b
[,1]
[1,] 5
[2,] 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
[,1]
[1,] 5
[2,] 5
[3,] 5
[[2]]
[[2]]$a
[,1]
[1,] 7
[2,] 7
[3,] 7
[[2]]$b
[,1]
[1,] 7
[2,] 7
[3,] 7
[4,] 7
[5,] 7
[6,] 7
[7,] 7
[[2]]$c
[,1]
[1,] 7
...etc
[[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
etc...
任何援助都会有帮助。我所有的尝试,尝试使用plyer和dplyr,但没有成功,而且非常困难。我们可以使用
base R
来实现这一点。不需要软件包
lapply(List_tot, `[`, c("a", "c", "d"))
或者使用匿名函数
lapply(List_tot, function(x) x[c("a", "c", "d")])
如果我们需要前2个,
order
行数(length
工作,因为它们是单列矩阵
,因此行数等于元素总数,获取行数的有序向量的名称
的头
,并使用它来提取内部列表元素
lapply(List_tot, function(x) {
x1 <- x[c("a", "c", "d")]
v1 <- lengths(x1)
x1[head(names(v1)[order(-v1)], 2)]
})
lapply(列表,函数(x){
x1我们可以使用base R
来实现这一点。不需要软件包
lapply(List_tot, `[`, c("a", "c", "d"))
或者使用匿名函数
lapply(List_tot, function(x) x[c("a", "c", "d")])
如果我们需要前2个,order
行数(length
工作,因为它们是单列矩阵
,因此行数等于元素总数,获取行数的有序向量的名称
的头
,并使用它来提取内部列表元素
lapply(List_tot, function(x) {
x1 <- x[c("a", "c", "d")]
v1 <- lengths(x1)
x1[head(names(v1)[order(-v1)], 2)]
})
lapply(列表,函数(x){
x1在基数R中,您可以执行以下操作:
lapply(List_tot,
function(x) (y<-x[c("a", "c", "d")])[order(sapply(y, nrow), decreasing = TRUE)[1: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
etc
lappy(列表),
函数(x)(y在基数R中,您可以执行以下操作:
lapply(List_tot,
function(x) (y<-x[c("a", "c", "d")])[order(sapply(y, nrow), decreasing = TRUE)[1: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
etc
lappy(列表),
函数(x)(yUpdate)
对于第二个目标,您可以尝试
lapply(
List_tot,
function(lst) {
head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
}
)
library(magrittr)
List_colfilter <- lapply(List_tot, function(i)i[c("a","c","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)
给
[[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
[,1]
[1,] 7
[2,] 7
[3,] 7
[4,] 7
[5,] 7
[6,] 7
[7,] 7
[8,] 7
[9,] 7
[[2]]$a
[,1]
[1,] 7
[2,] 7
[3,] 7
[[3]]
[[3]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[3]]$d
[,1]
[1,] 5
[2,] 5
[3,] 5
[[4]]
[[4]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[4]]$d
[,1]
[1,] 5
[2,] 5
[3,] 5
[[5]]
[[5]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[5]]$d
[,1]
[1,] 5
[2,] 5
[3,] 5
- 对于第一个目标,“对于每个嵌套列表,仅选择列表/矩阵a、c和d。”
- 第二个目标是“为每个嵌套列表选择行数最多的列表/矩阵”
使现代化
对于第二个目标,您可以尝试
lapply(
List_tot,
function(lst) {
head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
}
)
library(magrittr)
List_colfilter <- lapply(List_tot, function(i)i[c("a","c","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)
给
[[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
[,1]
[1,] 7
[2,] 7
[3,] 7
[4,] 7
[5,] 7
[6,] 7
[7,] 7
[8,] 7
[9,] 7
[[2]]$a
[,1]
[1,] 7
[2,] 7
[3,] 7
[[3]]
[[3]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[3]]$d
[,1]
[1,] 5
[2,] 5
[3,] 5
[[4]]
[[4]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[4]]$d
[,1]
[1,] 5
[2,] 5
[3,] 5
[[5]]
[[5]]$c
[,1]
[1,] 5
[2,] 5
[3,] 5
[4,] 5
[5,] 5
[6,] 5
[7,] 5
[8,] 5
[9,] 5
[[5]]$d
[,1]
[1,] 5
[2,] 5
[3,] 5
- 对于第一个目标,“对于每个嵌套列表,仅选择列表/矩阵a、c和d。”
- 第二个目标是“为每个嵌套列表选择行数最多的列表/矩阵”
@akrun对步骤1(按列筛选)有一个清晰的答案。对于步骤2(按您可以尝试的行数筛选)
lapply(
List_tot,
function(lst) {
head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
}
)
library(magrittr)
List_colfilter <- lapply(List_tot, function(i)i[c("a","c","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)
库(magrittr)
List_colfilter@akrun对步骤1(按列筛选)有一个清晰的答案。对于步骤2,可以尝试按行数筛选
lapply(
List_tot,
function(lst) {
head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
}
)
library(magrittr)
List_colfilter <- lapply(List_tot, function(i)i[c("a","c","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)
库(magrittr)
谢谢你的反馈,你能解释一下吗?我的意思是(可能是我错了)。是否必须仅对选定的列表元素(即“a”、“c”、“d”)执行此操作,并返回一个,其中包含每个外部元素的最大行数lis@akrun好的,我明白你的意思。我认为这是两个独立的目标…谢谢你的信息,对于第二个目标,我正在尝试获得前两个行数最多的列表。我只是编辑d OP.@akrun好的,我更新了我的解决方案:)@akrun谢谢你的反馈,你能解释一下吗?我的意思是(可能是我错了)。是否必须仅对选定的列表元素(即“a”、“c”、“d”)执行此操作,并返回一个,其中包含每个外部元素的最大行数lis@akrun好的,我明白你的意思。我认为这是两个独立的目标…谢谢你的信息,对于第二个目标,我正在尝试获得前两个行数最多的列表。我只是编辑d OP.@akrun Okey,我更新了我的解决方案:)如果这些不是单列,那么nrow()
会起作用吗?@jackkelly然后,我们需要一个带有sapply/lappy
的第二个循环,即v1如果这些不是单列,那么nrow()
会起作用吗?@jackkelly然后,我们需要一个带有sapply/lappy
的第二个循环,即v1