如果 ID 满足 R 中至少一个组中的条件,则从所有组中删除 ID

Remove ID from all groups if ID meets a condition in at least one group in R

我有针对不同人群(V9 列)的 SNP(等位基因)(V1 列)频率(V8 列)。每个 SNP 都有一个 ID(在 V1 列中指定)。我想删除至少一组中 V8 中的值(等位基因频率)为 0 或 1 的 ID(数据帧按 V9 分组)。具体来说,我想从数据框(所有组)中删除 ID,而不仅仅是从满足条件的组中删除。

  V1       V8            V9
1: rs10002235 0.324468     CARIBBEAN
2: rs10002235 0.176471     ADYGEI
3: rs10002235 0.305402     EUR
4: rs10002235 0.240384     AFR
5: rs10002235 0.495604     AMISH
6: rs10002235 0.096153     LATINO
1: rs33333235 0.5          CARIBBEAN
2: rs33333235 0.4          ADYGEI
3: rs33333235 0.3          EUR
4: rs33333235 0.001        AFR
5: rs33333235 0.4          AMISH
6: rs33333235 0.09         LATINO

  

如果 rs10002235 频率 (V8) 在 V9 中指定的任何(至少一个)组中 <0.01 或 >0.99,则应将其从数据帧中删除。

输出会像这样:

   V1       V8            V9
    1: rs10002235 0.324468     CARIBBEAN
    2: rs10002235 0.176471        ADYGEI
    3: rs10002235 0.305402           EUR
    4: rs10002235 0.240384           AFR
    5: rs10002235 0.495604         AMISH
    6: rs10002235 0.096153        LATINO

如果对象是 data.table,分组 by 'V1',检查向量 (c(0, 1)) 中值的 any 是否是 %in% 'V8'、否定 (!)、提取行序列 (.I)、提取 ($tmp) 并使用它来对组进行子集化(假设采用精度小心)

library(data.table)
dt1[dt1[, .(tmp = .I[(!any(V8 > 0.99|V8 <= 0.01)) & 
    ! any(c(0, 1) %in% V8)]), by = V1]$tmp]

-输出

        V1       V8        V9
       <char>    <num>    <char>
1: rs10002235 0.324468 CARIBBEAN
2: rs10002235 0.176471    ADYGEI
3: rs10002235 0.305402       EUR
4: rs10002235 0.240384       AFR
5: rs10002235 0.495604     AMISH
6: rs10002235 0.096153    LATINO

数据

dt1 <- structure(list(V1 = c("rs10002235", "rs10002235", "rs10002235", 
"rs10002235", "rs10002235", "rs10002235", "rs33333235", "rs33333235", 
"rs33333235", "rs33333235", "rs33333235", "rs33333235"), V8 = c(0.324468, 
0.176471, 0.305402, 0.240384, 0.495604, 0.096153, 0.5, 0.4, 0.3, 
0.001, 0.4, 0.09), V9 = c("CARIBBEAN", "ADYGEI", "EUR", "AFR", 
"AMISH", "LATINO", "CARIBBEAN", "ADYGEI", "EUR", "AFR", "AMISH", 
"LATINO")), class = c("data.table", "data.frame"), row.names = c(NA, 
-12L))

考虑基数 R 的 ave 来计算条件的分组最大值。然后过滤这个计算。

cond <- ave(
     as.integer(dt$V8 < 0.01 | dt$V8 > 0.99),
     dt$V1, 
     FUN = max
)

dt[cond == 1]
  • group_by V1 而不是 V9
  • 在每个组中,检查是否存在 V8 值 <0.01 或 >0.99。如果是这样,请使用 any.
  • 删除组中的所有行
  • ungroup
library(magrittr)

df <- tibble::tribble(
    ~V1, ~V8, ~V9,
    "rs10002235", 0.324468,"CARIBBEAN",
    "rs10002235", 0.176471, "ADYGEI",
    "rs10002235", 0.305402, "EUR",
    "rs10002235", 0.240384, "AFR",
    "rs10002235", 0.495604, "AMISH",
    "rs10002235", 0.096153, "LATINO",
    "rs33333235", 0.5, "CARIBBEAN",
    "rs33333235", 0.4, "ADYGEI",
    "rs33333235", 0.3, "EUR",
    "rs33333235", 0.001, "AFR",
    "rs33333235", 0.4, "AMISH",
    "rs33333235", 0.09, "LATINO"
)

df %>%
  dplyr::group_by(V1) %>%
  dplyr::filter(!any(V8>0.99 | V8<.01)) %>% 
  dplyr::ungroup()