如果 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()
我有针对不同人群(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()