【问题标题】:How to subset a list using another list?如何使用另一个列表对列表进行子集化?
【发布时间】:2014-04-04 18:58:08
【问题描述】:

我有两个列表,我想使用另一个列表对列表中的数据进行子集化。比如说,我有名为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,])

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

【问题讨论】:

    标签: r list lapply sapply


    【解决方案1】:

    我能想到的最直接的解决方案是使用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 方法中使用的功能没有太大区别。

    【讨论】:

      【解决方案2】:

      在您的特定示例中,只需将 unlist 用作 hislist,这将使其成为值向量。

      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
      

      【讨论】:

      • 抱歉,我编辑了问题,我不想使用 unlist,因为当 mylist(a 和 b)中存在相同值时,它会给出不正确的结果
      猜你喜欢
      • 2018-02-01
      • 2018-06-16
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多