【问题标题】:Subsetting data frame by single words occuring in column name通过列名中出现的单个单词对数据框进行子集
【发布时间】:2020-05-25 21:01:15
【问题描述】:

我是stackoverflow和R的新手,所以我希望我没有违反任何礼仪:)

所以我有一个相当大的基因表达水平数据框,称为expression,我想根据列名中出现的单词定义子集。

gene.adk1 gene.adk2 gene.adk3 gene.bas1 gene.bas2   etc
1         2         1         4         6

这只是数据框的一个小示例版本。我想要做的是定义一个子集只包含标题中包含“adk”的列和标题中包含“bas”的列的另一个子集

我所做的是按字母顺序对列名进行排序并查看我的数据框以找出标题中包含“adk”的列的数量。然后我使用子集函数定义了子集:

adk <- subset.data.frame(expression, select = c(1:3))

有没有更优雅的方式来做到这一点?可能通过列名中的“adk”等单个词来定义子集?

提前致谢

马吕斯

【问题讨论】:

    标签: r subset


    【解决方案1】:

    子集adk:

    adk <- expression[grepl("\\.adk", names(expression)]
    

    子集bas:

    bas <- expression[grepl("\\.bas", names(expression)]
    

    【讨论】:

    • 非常感谢!这正是我想要的
    【解决方案2】:

    我们可以使用grep 匹配列名中的子字符串“adk”、“bas”来选择这些列

    adkexprs <- expression[grep('adk', names(expression))]
    basexprs <- expression[grep('bas', names(expression))]
    

    另外,为了使匹配更精确

    adkexprs <- expression[grep('^gene\\.adk\\d+$', names(expression))]
    basexprs <- expression[grep('^gene\\.bas\\d+$', names(expression))]
    

    grep 返回数字索引,而grepl 返回逻辑向量。这是唯一的区别

    adkexprs <- expression[grepl('adk', names(expression))]
    basexprs <- expression[grepl('bas', names(expression))]
    

    或者使用select 来自dplyr

    library(dplyr)
    adkexprs <- expression %>%
          select(matches('adk'))
    
    basexprs <- expression %>%
          select(matches('bas'))
    

    【讨论】:

    • 感谢您在回答中付出了这么多努力!我真的很感激 :) grepl 函数正是我想要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2016-07-02
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多