簡體   English   中英

在r中創建一個計數表(矩陣)

[英]Create a table (matrix) of counts in r

我正在嘗試從一系列已轉換為數據框的列表中開發一個表。 每個列表由字符串及其計數組成。 每個字符串在7到20(或更多)之間變化。 每個列表都有一個標頭,用於標識字符串的來源。 我有66個列表(來源)。 每個列表包含5,000多個字符串。 並非每個列表中都包含每個字符串,因此列表中的字符串數會有所不同。 這是單個列表結構的示例。

$PreAg_18_2

CDR3.aa         Clones
 <chr>            <int>
CASSYGTAYTGELFF   1623
CASSRGDSDNSPLHF   1440
CASSREKAFF        1161
CSGMGALAKNIQYF     949
CSAYTGLSYEQYF      813
CASSLSLAVNSPLHF    634
CAIRDTPGSPQHF      574
CATGQVNTEAFF       555
CASSLKGQGGSPLHF    499
CASSYSRSPQPQHF     478

我想將結果合並到一個表中,該表顯示計數(克隆)以及y軸上列出的所有字符串(CDR3.aa)和x軸上的每個列表標頭(Sample.Id)。 一個例子是:

            10_pep_10_1     preAg_10_2      Dec_2_18_1  …... 
CASSYGTAYTGELFF    1623         234             0
CASSRGDSDNSPLHF    1440         522             28
CASSREKAFF         1161         445             50  
CSGMGALAKNIQYF      949         24              0
CASSYSRSPQPQHF      478         0               398
.
.

我能夠生成包含示例中的的單個列表,並且我認為將列表轉換為數據框是一種更好的操作它們的方法,但是在將它們與單個列表合並時遇到了麻煩所有字符串,然后將sample.id移至x軸。 我在想我取消列出所有字符串並將它們連接到一個df中,但是我不確定如何使計數與字符串匹配。 R中是否有功能可以幫助我做到這一點? 還是不可避免地要形成循環?

到目前為止,我已經能夠生成字符串的全局列表,但是現在我需要按標頭(sample.id)匹配計數。 不知道如何解決這個問題。

    library(immunarch)
    library(stringr)
    library(plyr)

    immdata = repLoad("/mnt/data/Development/Analysis_Script/input_files/")

    all <- immdata$data

    # Get list headers (names)
    sample.id <- names(all)

    # make new variable for extraction of clones
    all.c <- all

    # Get list of clones and filter for unique clones per list.
    for (i in 1:length(all.c)){
        all.c[[i]]$Sample.ID<-names(all.c)[i]
        all.c[[i]]<-all.c[[i]][,c("CDR3.aa", "Clones")]
    }


    # bysamp is a list (vector) of the samples and their clones
    bysamp <- split(all.c, sample.id, sep=" ")

    # make vector of all clones
    all.clones <- unlist(all.c, use.names=FALSE)

    # a list of the aggregate of all the clones in all the samples.
    all.clones

    # Removes clone repeats
    all.clones.u <- unique(all.clones)

    # convert list of clones and sample.ids to data frame
    all.clones.u <- data.frame(all.clones.u)
    sample.id <- data.frame(sample.id)

    # Addtional code here:

有關預期矩陣,請參見上面的摘要(表)

這是根據我對數據結構的最佳猜測得出的解決方案(聽起來很熟悉,因為我被免疫學家包圍)。 關鍵是向每個源添加一個變量,以跟蹤該源。 然后,可以將源(列表/數據框架)組合為單個數據框架並進行進一步處理。

首先,為可重現的示例設置一個隨機數種子。

  set.seed(1234)

創建簡化的人工數據集。 這將包含6個來源(list / data.frames)。 每個data.frame具有兩個名為aaclones變量。 從A,B和C中隨機選擇的三個字母分別作為12個可能的aa值中的CDR3氨基酸。 每個克隆的計數存儲在clones ,並設置為10到20之間的隨機數。最后,為6個list / data.frames中的每一個命名。 我使用的是source_1,source_2等,而不是“ 10_pep_10_1”。

希望這可以復制您面對的數據。 通過僅使用3種可能的氨基酸,此示例可確保同一序列在不同列表中多次出現的可能性很高。

# generate sample data
  spl <- replicate(6, { # the braces '{}' define an expression to be repeated
      n <- 12 # number of aa values in each list
      aa <- replicate(n,
        paste(sample(LETTERS[1:3], 3, replace = T), collapse = ""))
      clones <- sample(10:20, n, replace = T)
      data.frame(aa, clones)}, # this is the 'return' value of the expression
    simplify = FALSE) # this ensures that the result remains as a list

# name each list
  names(spl) <- paste("source", seq_along(spl), sep = "_")

檢查6個data.frame中的第一個。

  head(spl$source_1)
>    aa clones
> 1 ABB     12
> 2 BCB     12
> 3 AAB     20
> 4 BCB     18
> 5 ACA     16
> 6 CAA     17

向每個包含源名稱的list / data.frame中添加一個名為source的新變量。 使用簡單的for循環即可輕松完成此操作。 在第一個data.frame中顯示更改。

  for (i in seq_along(spl)) spl[[i]]$source <- names(spl)[i]

  head(spl$source_1) # or head(spl[[1]])
>    aa clones   source
> 1 ABB     12 source_1
> 2 BCB     12 source_1
> 3 AAB     20 source_1
> 4 BCB     18 source_1
> 5 ACA     16 source_1
> 6 CAA     17 source_1

現在,將每個list / data.frame組合到一個data.frame中,變量source跟蹤哪個list / data.frame貢獻了值。 然后使用基本函數計算每個肽段( aa )和source的數量( clones )。 存儲在res的結果是另一個data.frame。 由此將生成一個列聯計數表。 通常,這被合並為一個步驟。 有關更多信息,請參見help aggregate()文件。 此類數據整理的一種流行方法是使用dplyr軟件包。

  dat <- do.call(rbind, spl)

  res <- aggregate(clones ~ aa + source, dat, sum)
  tbl <- xtabs(clones ~ aa + source, res)

# this operation is rather common and often is done in one line:
  tbl <- xtabs(clones ~ ., aggregate(clones ~ ., dat, sum))

  head(tbl, 10)
>      source
> aa    source_1 source_2 source_3 source_4 source_5 source_6
>   AAA       29        0       46        0        0       14
>   AAB       20        0        0        0        0        0
>   ABB       12       14       13        0        0        0
>   ACA       16       23       16        0        0        0
>   ACB       13       19       15        0        0        0
>   BAA       17        0        0       55       16       33
>   BAC       15       19       19        0       34        0
>   BCB       30        0        0       68       38       15
>   CAA       17       11        0        0        0        0
>   CCA       15        0        0        0        0        0

表中條目的順序很簡單,即rbind期間繼承的順序。 可以通過重新組織表格來改變它。 在此,對行進行排序。

  ord <- order(rownames(tbl))
  head(tbl[ord,], 10)
>      source
> aa    source_1 source_2 source_3 source_4 source_5 source_6
>   AAA       29        0       46        0        0       14
>   AAB       20        0        0        0        0        0
>   AAC        0       19       19        0        0       31
>   ABA        0       11        0        0       15       18
>   ABB       12       14       13        0        0        0
>   ACA       16       23       16        0        0        0
>   ACB       13       19       15        0        0        0
>   ACC        0       11       16        0       15        0
>   BAA       17        0        0       55       16       33
>   BAB        0       15        0        0        0        0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM