如何将名称列表传递给list.select?

时间:2018-09-06 20:35:58

标签: r list data-manipulation

假设我想使用list.select包中的rlist函数来选择两个字段。

x <- list(p1 = list(type='A',score=list(c1=10,c2=8)),
      p2 = list(type='B',score=list(c1=9,c2=9)),
      p3 = list(type='B',score=list(c1=9,c2=7)))

而不是使用以下语法:

list.select(x, type, score)

我想使用此列表,但是不起作用:

param <- c("type", "score")
list.select(x, param)

2 个答案:

答案 0 :(得分:0)

不确定如何使用list.select来做到这一点,但这是一个purrr解决方案:

library(purrr)

param <- c("type", "score")
map(x, `[`, param)

这显然也适用于lapply

lapply(x, `[`, param)

但是如果您有更深层的列表嵌套列表,请使用modify_depth

modify_depth(x, 1, `[`, param)

可以调整.depth自变量以深入层次结构。

输出:

$p1
$p1$type
[1] "A"

$p1$score
$p1$score$c1
[1] 10

$p1$score$c2
[1] 8


$p2
$p2$type
[1] "B"

$p2$score
$p2$score$c1
[1] 9

$p2$score$c2
[1] 9


$p3
$p3$type
[1] "B"

$p3$score
$p3$score$c1
[1] 9

$p3$score$c2
[1] 7

答案 1 :(得分:0)

这是使用eval(parse(.))的骇人听闻的方式,但结果与您的解决方案不同。碎片在那里。

> str(list.select(x, do.call(c, sapply(param, FUN = function(x) eval(parse(text = x))))))
List of 3
 $ p1:List of 1
  ..$ :List of 3
  .. ..$ type    : chr "A"
  .. ..$ score.c1: num 10
  .. ..$ score.c2: num 8
 $ p2:List of 1
  ..$ :List of 3
  .. ..$ type    : chr "B"
  .. ..$ score.c1: num 9
  .. ..$ score.c2: num 9
 $ p3:List of 1
  ..$ :List of 3
  .. ..$ type    : chr "B"
  .. ..$ score.c1: num 9
  .. ..$ score.c2: num 7
> str(list.select(x, type, score))
List of 3
 $ p1:List of 2
  ..$ type : chr "A"
  ..$ score:List of 2
  .. ..$ c1: num 10
  .. ..$ c2: num 8
 $ p2:List of 2
  ..$ type : chr "B"
  ..$ score:List of 2
  .. ..$ c1: num 9
  .. ..$ c2: num 9
 $ p3:List of 2
  ..$ type : chr "B"
  ..$ score:List of 2
  .. ..$ c1: num 9
  .. ..$ c2: num 7