首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在所有复制中至少有一个组(列集)大于N个计数,则为rowSums

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

Stack Overflow用户
提问于 2022-10-28 15:04:07
回答 2查看 64关注 0票数 2

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

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

代码语言:javascript
复制
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

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

现在,我只知道如何筛选出在所有样本中没有表达到某个阈值以下的基因。例如,过滤掉根本没有表达的基因。

代码语言:javascript
复制
keep1 <- rowSums(df) > 1
df1 <- df[keep1,]

我想要的是改进这一点,这样我就可以在我的示例集中放弃geneE,因为对于这两个副本,没有一个组的计数超过0。

代码语言:javascript
复制
df2 <- df[1:4,]
df2
EN

回答 2

Stack Overflow用户

发布于 2022-10-28 15:05:39

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

代码语言:javascript
复制
df[rowSums(df > 1) > 1,]

-output

代码语言:javascript
复制
      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 )或& (和)都可以工作。评论中不清楚

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2022-10-28 15:56:25

这是另一个选择。如果数据总是按照所显示的方式构造,则此函数将计算所有副本的值至少大于N。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74237291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档