gpt4 book ai didi

r - 如何删除嵌套列表列表中的元素?

转载 作者:行者123 更新时间:2023-12-04 10:12:51 24 4
gpt4 key购买 nike

我怎么去

x <- list(p1 = list(type='A',score=list(c1=10,c2=8,c3=data.frame(a=1, b=3, c=5))),
p2 = list(type='B',score=list(c1=9,c2=9,c3=data.frame(a=2, b=2))),
p3 = list(type='B',score=list(c1=9,c2=7,c3=data.frame(a=2, b=2))))

没有数据框“c3”元素的列表?

最好以 tidyverse 友好的方式或我可以放在管道中间的方式。

我已经尝试过 list.remove、nested lapply、rapply、Filter,但似乎无法让它们正常工作...而且我不想取消列出我的嵌套列表结构。

(编辑:抱歉,我在原始问题(见下文)中的样本数据中有错别字,但如果您的解决方案在这两种情况下都适用,那就太好了!)

x <- list(p1 = list(type='A',score=list(c1=10,c2=8,c3=data.frame(a=1, b=3, c=5))),
p2 = list(type='B',score=list(c1=9,c2=9,c3=data.frame(a=2, b=2)),
p3 = list(type='B',score=list(c1=9,c2=7,c3=data.frame(a=2, b=2)))))

最佳答案

这是使用 modify_depth 的正确场景,它用作 modify 链访问深层嵌套列表的快捷方式。 modify 在这个问题上比 map 有优势,因为它会保留输入的类型,而不是将所有内容强制转换为列表,如果你有向量元素,这可能是相关的列表结构。

使用您给定的输入(内部有一个 p3 元素,而不是与 p2 在同一层),第二层和第三层的 dataframe 元素是 丢弃如下。为了搜索嵌套列表的所有层级,我们可以设置一个 while 循环来遍历层级,并在进行时丢弃数据帧。我们需要 .ragged = TRUE 来处理列表深度的错误。此版本搜索自下而上,但您也可以将其更改为自上而下搜索。

library(tidyverse)
x <- list(
p1 = list(type = "A", score = list(c1 = 10, c2 = 8, c3 = data.frame(a = 1, b = 3, c = 5))),
p2 = list(
type = "B", score = list(c1 = 9, c2 = 9, c3 = data.frame(a = 2, b = 2)),
p3 = list(type = "B", score = list(c1 = 9, c2 = 7, c3 = data.frame(a = 2, b = 2)))
)
)

remove_dataframes <- function(input_list) {
current_list <- input_list
current_depth <- vec_depth(current_list)
# current_depth <- max_depth
while (current_depth > 1) {
current_list <- modify_depth(
.x = current_list,
.depth = current_depth,
.f = ~ discard(., is.data.frame),
.ragged = TRUE
)
current_depth <- current_depth - 1
}
return(current_list)
}

x %>%
remove_dataframes %>%
glimpse
#> List of 2
#> $ p1:List of 2
#> ..$ type : chr "A"
#> ..$ score:List of 2
#> .. ..$ c1: num 10
#> .. ..$ c2: num 8
#> $ p2:List of 3
#> ..$ type : chr "B"
#> ..$ score:List of 2
#> .. ..$ c1: num 9
#> .. ..$ c2: num 9
#> ..$ p3 :List of 2
#> .. ..$ type : chr "B"
#> .. ..$ score:List of 2

reprex package 创建于 2019-02-20 (v0.2.1)

关于r - 如何删除嵌套列表列表中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54777549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com