R:选择数据框中同时包含正值和负值的行

R:选择数据框中同时包含正值和负值的行,r,dataframe,dplyr,integer,subset,R,Dataframe,Dplyr,Integer,Subset,我在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"

我在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')
在这个数据框中,基因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),]
正如你所看到的,这个代码是有效的,因为它只选择了基因2和4。然而,我觉得我应该能够以一种更优雅的方式完成这项工作。因此,我向你们提出一个问题:有没有更好的方法来做到这一点?我最感兴趣的是一种解决方案,它可以立即选择所有同时具有正值和负值的行,而不是首先提取只有正值或负值的行


已经谢谢你了

带有
符号的选项
带有
all
。我们可以在执行
rowwise

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
解决方案:简单但有效。
       contrast_1 contrast_2 contrast_3
gene_2        1.3       2.30      -4.50
gene_4       -1.2       0.02      -0.24
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
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