如何根据 R 中的 2 个条件 select 数据?

How to select data based on 2 conditions in R?

我正在寻找 select 基于 2 个条件的数据子集:

首先,这是我的数据:

Gene           AreaID   Label
DNAJC12      rs1111111  unlikely
HERC4        rs1111111  unlikely
RP11-57G10.8 rs2222222  possible
RPL12P8      rs1111111  unlikely
SIRT1        rs3333333  certain
RP11-57G10.8 rs3333333  possible
RPL12P8      rs3333333  unlikely
SIRT1        rs3333333  unlikely

我希望将其子集化为 select 带有 'unlikely' 标签的基因,并且它们是否具有相同的区域 ID。但是,对于具有任何其他标签的任何其他基因,ID 也必须 而不是 存在。

所以例如我的输出只会 select 这个:

Gene          AreaID      Label
DNAJC12     rs1111111   unlikely
HERC4       rs1111111   unlikely
RPL12P8     rs1111111   unlikely

不包括rs333333区域ID,它不太可能有重复ID,但也有不同标签的基因。

本质上,我正在寻找仅将基因标记为不太可能的区域的子集。

我已尝试阅读此处的类似问题,但这似乎不起作用:

loci <- read.csv('dataset.csv')
sub_list <- lapply(1:length(loci), function(i) loci %>% filter(loci$AreaID==duplicated(loci) & loci$Label =='unlikely'))
do.call(rbind, sub_list)

我也试过:

prediction_snps = loci$AreaID[loci$label == 'unlikely']
result = loci[prediction_snps, ]

由于我是 R 的新手,目前我不确定还有什么方法可以解决这个问题

我们可以试试

library(dplyr)
df1 %>% 
    filter(AreaID != "rs3333333") %>% 
    filter(Label == "unlikely")
#    Gene    AreaID    Label
#1 DNAJC12 rs1111111 unlikely
#2   HERC4 rs1111111 unlikely
#3 RPL12P8 rs1111111 unlikely

或者也可以

df1 %>%  group_by(AreaID) %>% filter(first(Label) ==  "unlikely")

base 中,您可以获得 区域的子集,这些区域仅具有标记为不可能 的基因:

loci <- read.table(header = TRUE, text="Gene           AreaID   Label
DNAJC12      rs1111111  unlikely
HERC4        rs1111111  unlikely
RP11-57G10.8 rs2222222  possible
RPL12P8      rs1111111  unlikely
SIRT1        rs3333333  certain
RP11-57G10.8 rs3333333  possible
RPL12P8      rs3333333  unlikely
SIRT1        rs3333333  unlikely")

#Get AreaID where all are labelled unlikely
tt <- aggregate(cbind(all=Label=="unlikely") ~ AreaID, data=loci, FUN=all)

#Merge with those AreaID's to get Genes
merge(loci, tt[tt$all,]["AreaID"])

#     AreaID    Gene    Label
#1 rs1111111 DNAJC12 unlikely
#2 rs1111111   HERC4 unlikely
#3 rs1111111 RPL12P8 unlikely

group_by AreaID 然后过滤所有 Label 等于 "unlikely"

的地方
library(dplyr)
df %>% group_by(AreaID) %>% filter(all(Label=="unlikely"))

# A tibble: 3 x 3
  # Groups:   AreaID [1]
  Gene    AreaID    Label   
  <chr>   <chr>     <chr>   
  1 DNAJC12 rs1111111 unlikely
  2 HERC4   rs1111111 unlikely
  3 RPL12P8 rs1111111 unlikely