如何使用其他列表对列表进行子集化?

时间:2014-04-04 18:58:09

标签: r list lapply sapply

我有两个列表,我想使用另一个列表在列表中对数据进行子集化。说,我有名为mylisthislist的列表:

mylist <- list(a = data.frame(cola = 1:3, colb = 4:6), 
           b = data.frame(cola = 1:3, colb = 6:8))
> mylist
$a
  cola colb
1    1    4
2    2    5
3    3    6

$b
  cola colb
1    1   6
2    2   7
3    3   8

> 

hislist

hislist <- list(a = 5:6, 
                b = 7:8)

> hislist
$a
[1] 5 6

$b
[1] 7 8

我尝试使用lapply函数对mylist进行子集化:

lapply(mylist, function(x) subset(x, colb %in% hislist))
#or
lapply(mylist, function(x) x[x$colb %in% hislist,])

但这些不起作用。如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

我能想到的最直接的解决方案是使用mapply

mapply(function(x, y) x[x[, 2] %in% y,], mylist, hislist, SIMPLIFY=FALSE)
# $a
#   cola colb
# 2    2    5
# 3    3    6
# 
# $b
#   cola colb
# 2    2    7
# 3    3    8

该功能与您在当前lapply方法中使用的功能没有太大差别。

答案 1 :(得分:1)

在您的特定示例中,只需对此列表使用unlist,这将使其成为值的向量。

lapply(mylist, function(x) x[x$colb %in% unlist(hislist),])
$a
  cola colb
2    2    5
3    3    6

$b
  cola colb
2    2   11
3    3   12