【问题标题】:Index nested lists of named data frames using character vector - R使用字符向量索引命名数据帧的嵌套列表 - R
【发布时间】:2018-09-20 18:50:32
【问题描述】:

我有一个嵌套的命名数据框列表,如下所示:

mylist2 <- list(
  list(df1.a = data.frame(replicate(2,sample(0:1,5,rep=TRUE))), df2.b = data.frame(replicate(2,sample(0:1,5,rep=TRUE)))),
  list(df3.c = data.frame(replicate(2,sample(0:1,5,rep=TRUE))), df4.d = data.frame(replicate(2,sample(0:1,5,rep=TRUE)))),
  list(df5.e = data.frame(replicate(2,sample(0:1,5,rep=TRUE))), df6.f = data.frame(replicate(2,sample(0:1,5,rep=TRUE)))))

我运行了一个测试(不重要的是什么类型的测试),它会生成一个字符向量,告诉我这个列表中哪些数据帧是重要的:

test
[1] "df1.a" "df5.e"

使用此字符向量从嵌套列表中提取这些数据帧的最有效方法是什么?测试只显示第二个列表的名称,所以nestedlist[test] 不起作用。

【问题讨论】:

  • mylist2[names(mylist2) %in% test],或mylist2[match(test, names(mylist2))] 还有:“所以像 mylist2[test[1]] 这样的东西效率不高”你怎么会这么想?跨度>
  • 哦,拍!我把我的示例问题简化了太多。我实际上有一个数据框列表的列表。不知道如何简单地重现它,但问题是列表的元素可能被命名为[[5]]df1.a, [[5]]df2.b, [[6]]df3.c, [[6]]df4.d,并且测试只产生嵌套列表的名称(例如df1.a)。
  • 试试lapply(mylist2, '[', test)
  • 能否请您检查一下您的示例,因为我不确定这是否是模仿您的原始数据的示例
  • @akrun 谢谢,现在编辑。 :)

标签: r list dataframe indexing


【解决方案1】:

正如 OP 所说,它是一个嵌套的 list,我们可以循环遍历最初的 list,然后使用 [ 提取第二个 list 的元素

lapply(mylist2, '[', test)

或使用tidyverse

library(tidyverse)
map(mylist2, ~ .x %>% 
                   select(test))

更新

基于更新的数据集:

Filter(length, lapply(mylist2, function(x) x[intersect(test, names(x))]))

【讨论】:

  • 非常感谢,很抱歉给您带来了困惑。您的第一个和最后一个答案效果很好。
【解决方案2】:

这是一个可重现的示例,包括使用嵌套 lists 的示例数据:

# Sample data
lst <- list(
    list(df1.a = 1, df2.b = 2),
    list(df3.c = 3, df4.d = 4),
    list(df5.e = 5, df6.f = 6))
test <- c("df1.a", "df5.e");

ret <- lapply(lst, function(x) x[names(x) %in% test])
ret[sapply(ret, length) > 0];
#[[1]]
#[[1]]$df1.a
#[1] 1
# 
# 
#[[2]]
#[[2]]$df5.e
#[1] 5

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 2021-01-14
    • 2013-08-28
    • 2020-03-21
    • 2018-09-02
    • 2023-03-12
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多