首页 > 解决方案 > R - 如何按名称从列表的子列表中选择元素

问题描述

我有一个看起来像这样的列表:

list(list("A[1]" = data.frame(W = 1:5),
          "A[2]" = data.frame(X = 6:10),
          B = data.frame(Y = 11:15),
          C = data.frame(Z = 16:20)),
     list("A[1]" = data.frame(W = 21:25),
          "A[2]" = data.frame(X = 26:30),
          B = data.frame(Y = 31:35),
          C = data.frame(Z = 36:40)),
     list("A[1]" = data.frame(W = 41:45),
          "A[2]" = data.frame(X = 46:50),
          B = data.frame(Y = 51:55),
          C = data.frame(Z = 56:60))) -> dflist

我需要我的输出也是一个长度为 3 的列表列表,以便每个子列表保留名称以开头的元素,A[同时删除其他元素。

基于以前的一些问题,我正在尝试使用它:

dflist %>% 
    map(keep, names(.) %in% "A[")

但这给出了以下错误:

Error in probe(.x, .p, ...) : length(.p) == length(.x) is not TRUE

尝试选择单个元素,例如A[1]

dflist %>% 
    map(keep, names(.) %in% "A[1]")

也不起作用。我怎样才能达到预期的输出?

标签: rpurrr

解决方案


我想你想要:

purrr::map(dflist, ~.[stringr::str_starts(names(.), "A\\[")])

这是做什么的:

  • 对于每个子列表 ( purrr::map)
    • 选择该子列表的所有元素( ,子列表.[]在哪里.
    • 谁的名字以A[( stringr::str_starts(names(.), "A\\["))开头

你得到了正确的顶层map,因为你想修改子列表。但是,map(keep, names(.) %in% "A[")有一些问题:

  • names(.) %in% "A["应该是一个函数或一个公式(以~
  • purrr::keep将过滤功能应用于子列表的每个元素,即直接应用于数据帧。它永远不会“看到”每个数据框的名称。实际上,我认为您根本keep无法解决此问题

无论如何,这会产生:

[[1]]
[[1]]$`A[1]`
  W
1 1
2 2
3 3
4 4
5 5

[[1]]$`A[2]`
   X
1  6
2  7
3  8
4  9
5 10


[[2]]
[[2]]$`A[1]`
   W
1 21
2 22
3 23
4 24
5 25

[[2]]$`A[2]`
   X
1 26
2 27
3 28
4 29
5 30


[[3]]
[[3]]$`A[1]`
   W
1 41
2 42
3 43
4 44
5 45

[[3]]$`A[2]`
   X
1 46
2 47
3 48
4 49
5 50

推荐阅读