【发布时间】: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