【问题标题】:How to index a dataframe that contains lists/vectors as values如何索引包含列表/向量作为值的数据框
【发布时间】:2020-12-12 06:13:44
【问题描述】:

索引数据框适用于单个值,但不适用于列表元素或向量的值。

我有两个需要匹配的基因列表。在每个列表中,基因被命名为不同的基因别名。我需要查询大量基因,以过滤掉两个数据集之间未共享的任何基因。为此,我创建了一个数据框,其中包含两个列表中的所有基因。数据框中的每个值要么是单个字符串,要么是多个字符串(别名)的向量。一个单独的列为每组别名分配一个唯一编号,我用它来匹配两个列表。对于每个基因,我需要检查它是否存在于数据框中。但我无法索引向量值。见下文:

df <- data.frame("col1"=I(list(c("MALAT1","FTK2","CAS9"),
                                 "MS4A6A",
                                 c("LACT1","FLEE6","LOC98"))),
                 "col2"=I(list(c("CASS4","MS4A2","NME"), 
                               "PLD3", 
                               "ADAM4")))
"MALAT1" %in% df$col1
[1] FALSE
"MS4A6A" %in% df$col1
[1] TRUE

【问题讨论】:

    标签: r indexing bioinformatics


    【解决方案1】:

    因为是list,我们可以unlist

    "MALAT1" %in% unlist(df$col1)
    #[1] TRUE
    

    第二个返回TRUE的原因是因为第二个元素是length 1,而带有“MALAT1”的元素不是

    -测试

    如果我们将具有单个元素的list 元素更改为“MALAT1”

    df$col1[2] <- "MALAT1"
    "MALAT1" %in% df$col1
    #[1] TRUE
    

    一般来说,当我们有一个list 时,如果我们想对每个元素进行测试

    lapply(df$col1, `%in%`, x = "LACT1")
    #[[1]]
    #[1] FALSE
    
    #[[2]]
    #[1] FALSE
    
    #[[3]]
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      这是另一种解决方法,它通过rapply + toString 将列中的lists 展平,从而在df 上发挥作用

      df[] <- rapply(df, toString, how = "unlist")
      

      这样

      > df
                       col1              col2
      1  MALAT1, FTK2, CAS9 CASS4, MS4A2, NME
      2              MS4A6A              PLD3
      3 LACT1, FLEE6, LOC98             ADAM4
      

      然后您可以使用grepl 来检查是否可以在列中找到目标,例如,

      > grepl("LACT1", df$col1, fixed = TRUE)
      [1] FALSE FALSE  TRUE
      
      > grepl("NME", df$col2, fixed = TRUE)
      [1]  TRUE FALSE FALSE
      

      【讨论】:

      • 非常感谢!很好的解决方案
      【解决方案3】:

      你快到了。只需将unlist() 包裹在您拥有的列表周围

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-14
        • 2020-02-17
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多