r-如果在所有复制中至少有一个组(列集)的计数大于N,则为rowSumes



我正在处理RNA-seq数据。我想在我的至少一个治疗组中,筛选出两个重复中计数少于N的基因。

我的数据在一个DESeq对象中,计数数据的结构是这样的,每行是基因,每列是不同的样本。样本名称的结构为X|N|A|1/2(其中X是所用的细胞系,N是反映处理长度的1或2位数字,A是代表处理组的字母,1或2表示哪个复制

X1A1 <- c(117, 24, 45, 146, 1)
X1A2 <- c(129, 31, 58, 159, 0)
X1B1 <- c(136, 25, 50, 1293, 0)
X1B2 <- c(131, 24, 50, 1073, 4)
X1C1 <- c(113, 23, 43, 132, 0)
X1C2 <- c(117, 18, 43, 126, 0)
X1D1 <- c(101, 20, 0, 875, 1)
X1D2 <- c(99, 21, 38 , 844, 0)
X24A1 <- c(109, 17, 60, 95, 0)
X24A2 <- c(122, 14, 611, 90, 0)
df <- data.frame(X1A1, X1A2, X1B1, X1B2, X1C1, X1C2, X1D1, X1D2, X24A1, X24A2)
rownames(df) <- c("geneA", "geneB", "geneC", "geneD", "geneE")
df

也许我只是没有使用正确的搜索词,但我不知道如何获得我需要的东西。

现在我只知道如何过滤掉所有样本中未低于某个阈值表达的基因。例如,过滤掉根本没有表达的基因。

keep1 <- rowSums(df) > 1
df1 <- df[keep1,]

我想要的是改进这一点,以便在我的示例集中丢弃geneE,因为没有一个组的两个复制计数都超过0。

df2 <- df[1:4,]
df2

逻辑应该应用于'df'本身以创建逻辑矩阵,然后当我们执行rowSums时,它计算TRUE(或1(值的数量,然后使用它来执行第二个条件,即至少一个以上的TRUE(> 1(

df[rowSums(df > 1) > 1,]

-输出

X1A1 X1A2 X1B1 X1B2 X1C1 X1C2 X1D1 X1D2 X24A1 X24A2
geneA  117  129  136  131  113  117  101   99   109   122
geneB   24   31   25   24   23   18   20   21    17    14
geneC   45   58   50   50   43   43    0   38    60   611
geneD  146  159 1293 1073  132  126  875  844    95    90

如果是按列分组,则|(OR(或&(AND(都可以工作。从评论中看不清楚

df[Reduce(`&`, lapply(split.default(df, sub("\d+$", "", 
names(df))), function(x) rowSums(x > 1) > 1)),]
X1A1 X1A2 X1B1 X1B2 X1C1 X1C2 X1D1 X1D2 X24A1 X24A2
geneA  117  129  136  131  113  117  101   99   109   122
geneB   24   31   25   24   23   18   20   21    17    14
geneD  146  159 1293 1073  132  126  875  844    95    90
df[Reduce(`|`, lapply(split.default(df, sub("\d+$", "", 
names(df))), function(x) rowSums(x > 1) > 1)),]
X1A1 X1A2 X1B1 X1B2 X1C1 X1C2 X1D1 X1D2 X24A1 X24A2
geneA  117  129  136  131  113  117  101   99   109   122
geneB   24   31   25   24   23   18   20   21    17    14
geneC   45   58   50   50   43   43    0   38    60   611
geneD  146  159 1293 1073  132  126  875  844    95    90

这里是另一个选项。如果你的数据总是按照你显示的方式结构化,那么这个函数将评估所有复制都至少有一个大于N的值。

library(tidyverse)
#example Data
df
#>       X1A1 X1A2 X1B1 X1B2 X1C1 X1C2 X1D1 X1D2 X24A1 X24A2
#> geneA  117  129  136  131  113  117  101   99   109   122
#> geneB   24   31   25   24   23   18   20   21    17    14
#> geneC   45   58   50   50   43   43    0   38    60   611
#> geneD  146  159 1293 1073  132  126  875  844    95    90
#> geneE    1    0    0    4    0    0    1    0     0     0

filter_fewer <- function(data, N){
gene_list <- data |>
rownames_to_column("gene") |>
pivot_longer(cols = -gene, 
names_to = c("var", "type", "rep"),
names_pattern = "(\w\d+)(\w)(\d+)") |>
pivot_wider(names_from = rep, values_from = value, names_glue = "rep_{rep}") |>
group_by(gene, var, type) |>
mutate(flag = if_any(c(rep_1, rep_2), ~.>N)) |>
ungroup() |>
group_by(gene) |>
filter(sum(flag) == n()) |>
pull(gene)|>
unique()
filter(data, row.names(data) %in% gene_list)
}
#your example
filter_fewer(df, 1)
#>       X1A1 X1A2 X1B1 X1B2 X1C1 X1C2 X1D1 X1D2 X24A1 X24A2
#> geneA  117  129  136  131  113  117  101   99   109   122
#> geneB   24   31   25   24   23   18   20   21    17    14
#> geneC   45   58   50   50   43   43    0   38    60   611
#> geneD  146  159 1293 1073  132  126  875  844    95    90
#remove geneB because neither A24A rep 1 or 2 are > 20
filter_fewer(df, 20)
#>       X1A1 X1A2 X1B1 X1B2 X1C1 X1C2 X1D1 X1D2 X24A1 X24A2
#> geneA  117  129  136  131  113  117  101   99   109   122
#> geneC   45   58   50   50   43   43    0   38    60   611
#> geneD  146  159 1293 1073  132  126  875  844    95    90

相关内容

  • 没有找到相关文章

最新更新