【问题标题】:R: select rows in data frame that contain both positive and negative valuesR:选择数据框中同时包含正值和负值的行
【发布时间】:2020-12-16 21:43:24
【问题描述】:

我在 R 中有一个包含多列的数据框。这些列中的值可以是负数或正数。结果,我有所有值为正的行,所有值为负的行,以及具有正值和负值的行。 我只想提取那些既有正值又有负值且不为零的行。

让我们用一个虚拟数据集来做这个:

x <- data.frame("contrast_1" = c(-1.2,1.3,1.4,-1.2,0), "contrast_2" = c(-1.8,2.3,2.4,0.02,-8), "contrast_3" = c(-0.23,-4.5,0.4,-0.24,-1.23))
row.names(x) <- c('gene_1', 'gene_2', 'gene_3', 'gene_4', 'gene_5')

数据框如下所示:

       contrast_1 contrast_2 contrast_3
gene_1       -1.2      -1.80      -0.23
gene_2        1.3       2.30      -4.50
gene_3        1.4       2.40       0.40
gene_4       -1.2       0.02      -0.24
gene_5        0.0      -8.00      -1.23

在这个数据框中,基因 2 和 4 包含正值和负值:这些是我要提取的行。基因 5 包含负值和零值。我不想要基因 5。

我用下面的代码解决了这个问题:

library(dplyr) 

#select all the rows that only have positive values
x_UP = x %>% filter_at(colnames(x), all_vars(. >= 0))

#select all the rows that only have negative values
x_DOWN = x %>% filter_at(colnames(x), all_vars(. <= 0))

#combine the data frames    
removed = rbind(x_UP,x_DOWN)

#remove the rows with only positive or only negative values from data frame x
subset = x [!row.names(x)%in%rownames(removed),]

输出如下所示:

       contrast_1 contrast_2 contrast_3
gene_2        1.3       2.30      -4.50
gene_4       -1.2       0.02      -0.24

如您所见,此代码有效,因为它只选择了基因 2 和 4。但是,我觉得我应该能够以更优雅的方式完成此操作。因此我向您提出问题:有没有更好的方法来做到这一点?我最感兴趣的解决方案可以立即选择具有正值和负值的所有行,而不是首先提取只有正值或只有负值的行。

已经谢谢了!

【问题讨论】:

    标签: r dataframe dplyr integer subset


    【解决方案1】:

    带有signall 的选项。在执行rowwise 之后,我们可以将c_acrossfilter 一起使用

    library(dplyr)
    x %>%
       rowwise %>%
       filter(all(c(-1, 1)  %in% sign(c_across(everything())) )) %>%
       ungroup
    # A tibble: 2 x 3
    #  contrast_1 contrast_2 contrast_3
    #       <dbl>      <dbl>      <dbl>
    #1        1.3       2.3       -4.5 
    #2       -1.2       0.02      -0.24
    

    或使用base R

    subset(x,  (rowSums(sign(x) < 0) > 0) & (rowSums(sign(x) > 0) > 0))
    #       contrast_1 contrast_2 contrast_3
    #gene_2        1.3       2.30      -4.50
    #gene_4       -1.2       0.02      -0.24
    

    【讨论】:

    • 非常感谢!我非常喜欢base R 解决方案:简单但有效。
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多