【问题标题】:how to acces list elements based on condition in r [duplicate]如何根据r中的条件访问列表元素[重复]
【发布时间】:2019-03-06 11:19:21
【问题描述】:

这看起来很简单,但是我无法很好地掌握它。假设我有这样的列表:

my_list=list(integer(0),c(4,3,3),integer(0),integer(0),c(5,2,5),integer(0))

我使用integer(0) 使其与我的原始数据相似,但此处的任何条件都适用。现在我想从我的列表中只提取那些不是integer(0) 的元素,像这样创建新的 2 元素列表:

list_I_try_to_make=list(c(4,3,3),c(5,2,5))

我知道如何对数据框执行此操作,但我不确定如何正确处理列表的每个元素。我尝试lapply 为每个元素添加条件,但这只是返回了具有相同长度的新列表,其中每个元素都是答案(如果length>0 它只返回TRUE/FALSE

【问题讨论】:

    标签: r list


    【解决方案1】:

    您可以使用purrr 包,在处理列表时非常方便。

    library(purrr)
    
    keep(my_list, function(x) length(x) > 0)
    

    【讨论】:

    • 你可以使用 ~ 简写来代替写函数,像这样:keep(my_list, ~ length(.x) > 0) 当使用波浪符简写时,(唯一的)函数参数总是“.x”。
    【解决方案2】:

    您可以使用lengths

    my_list[lengths(my_list) > 0]
    [[1]]
    [1] 4 3 3
    
    [[2]]
    [1] 5 2 5
    

    【讨论】:

      【解决方案3】:

      这是一种解决方案:

      my_list[ !unlist(lapply(my_list,identical,integer(0))) ]

      【讨论】:

        【解决方案4】:

        试试这个:

        my_filter=unlist(lapply(my_list,length))>0
        my_list[my_filter]
        [[1]]
        [1] 4 3 3
        
        [[2]]
        [1] 5 2 5
        

        【讨论】:

          【解决方案5】:

          你可以使用Filter:

          my_list <- list(integer(0),c(4,3,3),integer(0),integer(0),c(5,2,5),integer(0))
          Filter(function(x) length(x)>0, my_list)
          # [[1]]
          # [1] 4 3 3
          # 
          # [[2]]
          # [1] 5 2 5
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-25
            相关资源
            最近更新 更多