你好,這是我第一次在 R 中使用 for 回圈,我試圖弄清楚如何使用這個回圈自動創建多個變數。
我想多次運行以下命令來改變所涉及的基因
gene1_row_quantity_sample1 = sample_1 %>%
dplyr::filter(grepl("gene1",gene_type)) %>%
nrow()
在上面提到的代碼中,我有兩個變數:基因和樣本。樣本存盤在一個串列中:
my_list = list(
sample_1 = read.table(file = "S01.tsv", sep = "\t", header = F),
sample_1 = read.table(file = "S02.tsv", sep = "\t", header = F),
sample_1 = read.table(file = "S03.tsv", sep = "\t", header = F)
...
)
和基因存盤在串聯中:
genes = c("gene1","gene2","gene3"...)
那么,如何以一種可以檢索和存盤(基因 x 樣本)變數而不是手動執行的方式在 for 回圈中應用第一個代碼呢?
期望的輸出:
gene1_row_quantity_sample1
“行數”
gene2_row_quantity_sample1
“行數”
gene3_row_quantity_sample1
“行數”
gene1_row_quantity_sample2
“行數”
gene2_row_quantity_sample2
“行數”
gene3_row_quantity_sample2
“行數”
gene1_row_quantity_sample3
“行數”
gene2_row_quantity_sample3
“行數”
gene3_row_quantity_sample3
“行數”
謝謝你的時間
uj5u.com熱心網友回復:
我不確定這是否有效,您沒有提供一些可重復的示例,
但你可以試試
lapply(names(my_list), function(x) {
for(i in genes) {
y <- my_list[[x]] %>%
dplyr::filter(grepl(i, gene_type)) %>%
nrow()
print(paste(i, x, y))
}
})
uj5u.com熱心網友回復:
library(tidyverse)
map(my_list ~count(., gene_type))
uj5u.com熱心網友回復:
您當前的腳本會將“gene3”和“gene33”一起計算,即如果gene_type 為“gene3”或“gene33”或“gene3a”,則“grepl”對于“gene3”將為 TRUE:
gene1_row_quantity_sample1 = sample_1 %>%
dplyr::filter(grepl("gene3",gene_type)) %>%
nrow()
這是期望的結果嗎?還是您希望將gene_type == "gene3" 和genetype == "gene33" 分開計算?
如果您希望基因中的每個gene_type 都是唯一的,我認為最好的方法是讀取所有樣本,group_by sample/gene_type,過濾掉“gene_type not ingenes”(即過濾掉“gene33”),然后計算數量發生的次數,例如
~/Desktop/S01.tsv
gene_type,count
gene1,22
gene1,23
gene2,34
gene3,33
gene3,34
~/Desktop/S02.tsv
gene_type,count
gene1,22
gene2,23
gene2,34
gene2,33
gene3,34
~/Desktop/S03.tsv
gene_type,count
gene2,22
gene2,23
gene3,34
gene3,33
gene33,34
library(tidyverse)
#install.packages("vroom")
library(vroom)
#install.packages("fs")
library(fs)
setwd("~/Desktop")
filelist <- dir_ls(glob = "*.tsv")
df <- vroom(filelist, id = "Sample")
#> Rows: 15 Columns: 3
#> ── Column specification ────────────────────────────────────────────────────────
#> Delimiter: ","
#> chr (1): gene_type
#> dbl (1): count
#>
#> ? Use `spec()` to retrieve the full column specification for this data.
#> ? Specify the column types or set `show_col_types = FALSE` to quiet this message.
genes = c("gene1","gene2","gene3")
df %>%
group_by(Sample, gene_type) %>%
filter(gene_type %in% genes) %>%
summarise(n = n())
#> `summarise()` has grouped output by 'Sample'. You can override using the
#> `.groups` argument.
#> # A tibble: 8 × 3
#> # Groups: Sample [3]
#> Sample gene_type n
#> <chr> <chr> <int>
#> 1 S01.tsv gene1 2
#> 2 S01.tsv gene2 1
#> 3 S01.tsv gene3 2
#> 4 S02.tsv gene1 1
#> 5 S02.tsv gene2 3
#> 6 S02.tsv gene3 1
#> 7 S03.tsv gene2 2
#> 8 S03.tsv gene3 2
# And, for all gene_types (i.e. inc "gene33"):
df %>%
group_by(Sample, gene_type) %>%
summarise(n = n())
#> `summarise()` has grouped output by 'Sample'. You can override using the
#> `.groups` argument.
#> # A tibble: 9 × 3
#> # Groups: Sample [3]
#> Sample gene_type n
#> <chr> <chr> <int>
#> 1 S01.tsv gene1 2
#> 2 S01.tsv gene2 1
#> 3 S01.tsv gene3 2
#> 4 S02.tsv gene1 1
#> 5 S02.tsv gene2 3
#> 6 S02.tsv gene3 1
#> 7 S03.tsv gene2 2
#> 8 S03.tsv gene3 2
#> 9 S03.tsv gene33 1
由reprex 包(v2.0.1)創建于 2022-06-09
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488449.html
