【问题标题】:How to preserve base data frame rownames upon filtering in dplyr chain如何在 dplyr 链中过滤时保留基本数据框行名
【发布时间】:2018-01-07 16:59:32
【问题描述】:

我有以下数据框:


df <- structure(list(BoneMarrow = c(30, 0, 0, 31138, 2703), Pulmonary = c(3380, 
21223.3333333333, 0, 0, 27)), row.names = c("ATP1B1", "CYCS", 
"DDX5", "GNB2L1", "PRR11"), class = "data.frame", .Names = c("BoneMarrow", 
"Pulmonary"))

df 
#>        BoneMarrow Pulmonary
#> ATP1B1         30   3380.00
#> CYCS            0  21223.33
#> DDX5            0      0.00
#> GNB2L1      31138      0.00
#> PRR11        2703     27.00

我想要做的是删除任何列中值

> df %>% filter(!apply(., 1, function(row) any(row <= 8 )))
  BoneMarrow Pulmonary
1         30      3380
2       2703        27

如何在 dplyr 链中保存它?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用base R Boolean试试这个怎么样

    df[rowSums(df>8)==dim(df)[2],] 
    
           BoneMarrow Pulmonary
    ATP1B1         30      3380
    PRR11        2703        27
    

    EDIT1:或者你可以做df[!rowSums(df&lt;8),](根据@user20650)会给你同样的结果。

    【讨论】:

    • 简洁明了的答案。 df[!rowSums(df&lt;8),] 也会这样做
    • @user20650 你的回答更好~
    • @YOBEN_S 但你的解决方案看起来像基本R,而不是dplyr(但你写了“dplyr 绝对可以解决这个问题......”,所以我很好奇)。跨度>
    【解决方案2】:

    对于基因计数,您通常想知道是否至少 x 个样本的计数多于 y 个,而不是仅仅针对所有样本。

    不如 filter_if 漂亮,但我不确定如何使用 all_vars 实现相同的 rowSums 条件

       x <- sample_threshold  
       y <- count_threshold
    
       require(dplyr) 
       require(tibble)
    
       df %>%  
           tibble::rownames_to_column('gene') %>%  
           dplyr::filter(rowSums(dplyr::select(., -gene) > y) > x) %>%  
           tibble::column_to_rownames('gene')
    

    【讨论】:

      【解决方案3】:

      这里是另一个base R 方法Reduce

      df[Reduce(`&`, lapply(df, `>=`, 8)),]
      #       BoneMarrow Pulmonary
      #ATP1B1         30      3380
      #PRR11        2703        27
      

      【讨论】:

        【解决方案4】:

        您可以将行名转换为列并在过滤后恢复:

        library(dplyr)
        library(tibble)  # for `rownames_to_column` and `column_to_rownames`
        
        df %>%
            rownames_to_column('gene') %>%
            filter_if(is.numeric, all_vars(. >= 8)) %>%
            column_to_rownames('gene')
        
        #        BoneMarrow Pulmonary
        # ATP1B1         30      3380
        # PRR11        2703        27
        

        【讨论】:

        • 这个答案效果很好 - 但我一直想知道为什么 dplyr 首先要削减行名?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 2019-06-18
        • 1970-01-01
        • 2014-08-16
        相关资源
        最近更新 更多