我在处理RNA-seq数据。我想筛选出至少在我的一个治疗组中,在这两个复制中都少于N计数的基因。
我的数据位于一个DESeq对象中,计数数据是这样构造的,每一行都是基因,每一列都是不同的样本。样本名的结构为X_x_N_n_A_x_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发布于 2022-10-28 15:05:39
应该将逻辑应用于'df‘本身,以创建逻辑矩阵,然后当我们执行rowSums时,它会计数真(或1)值的数量,然后使用它来执行第二个条件,即至少有一个以上的TRUE (> 1)。
df[rowSums(df > 1) > 1,]-output
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 )或& (和)都可以工作。评论中不清楚
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发布于 2022-10-28 15:56:25
这是另一个选择。如果数据总是按照所显示的方式构造,则此函数将计算所有副本的值至少大于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 90https://stackoverflow.com/questions/74237291
复制相似问题