簡體   English   中英

根據多個條件匯總計數

[英]Summarize counts based on multiple conditions

我試圖根據兩個變量的組合來總結我的數據。 以下代碼用於處理數據:

df <- data_frame(fc = runif(1000, -5, 5),
           padj = runif(1000, 0, 1))

df %>% 
  summarise(
    dn_red = count(fc < -1.5, padj <= 0.1),
    dn_pink = count(fc < -1.5, padj >= 0.1),
    dn_blue = count(fc>-1.5 & fc< 0, padj <= 0.1),
    dn_grey = count(fc>-1.5 & fc< 0, padj >= 0.1),
    up_red = count(fc > 1.5, padj <= 0.1),
    up_pink = count(fc > 1.5, padj >= 0.1),
    up_blue = count(fc < 1.5 & fc > 0, padj <= 0.1),
    up_grey = count(fc < 1.5 & fc > 0, padj >= 0.1)
  )

在編寫它幾個月后運行它會引發以下錯誤:

Error: Problem with `summarise()` input `dn_red`.
x no applicable method for 'count' applied to an object of class "logical"
ℹ Input `dn_red` is `count(fc < -1.5, padj <= 0.1)`.

我可以看到 count 輸出一個帶有與條件相對應的邏輯向量的小標題。 我試圖從中得到的是計數的摘要,其中兩個條件都為真。 上面的代碼曾經這樣做......

您可能想要sum而不是count

set.seed(1)
df <- data.frame(fc = runif(1000, -5, 5),
                 padj = runif(1000, 0, 1))

df %>% 
  summarise(
    dn_red = sum(fc < -1.5, padj <= 0.1),
    dn_pink = sum(fc < -1.5, padj >= 0.1),
    dn_blue = sum(fc>-1.5 & fc< 0, padj <= 0.1),
    dn_grey = sum(fc>-1.5 & fc< 0, padj >= 0.1),
    up_red = sum(fc > 1.5, padj <= 0.1),
    up_pink = sum(fc > 1.5, padj >= 0.1),
    up_blue = sum(fc < 1.5 & fc > 0, padj <= 0.1),
    up_grey = sum(fc < 1.5 & fc > 0, padj >= 0.1)
  )

  dn_red dn_pink dn_blue dn_grey up_red up_pink up_blue up_grey
1    494    1250     269    1025    458    1214     267    1023

但這會造成重疊。 因此,您需要在邏輯條件下用&|替換, 視情況可以是。 看。

df %>% 
  summarise(
    dn_red = sum(fc < -1.5 & padj <= 0.1),
    dn_pink = sum(fc < -1.5 & padj >= 0.1),
    dn_blue = sum(fc>-1.5 & fc< 0 & padj <= 0.1),
    dn_grey = sum(fc>-1.5 & fc< 0 & padj >= 0.1),
    up_red = sum(fc > 1.5 & padj <= 0.1),
    up_pink = sum(fc > 1.5 & padj >= 0.1),
    up_blue = sum(fc < 1.5 & fc > 0 & padj <= 0.1),
    up_grey = sum(fc < 1.5 & fc > 0 & padj >= 0.1)
  )

  dn_red dn_pink dn_blue dn_grey up_red up_pink up_blue up_grey
1     44     328      20     127     40     296      18     127

如果這是您所期望的,那么建議將1000數據點分成 8 個 colors。 請改用此代碼

df %>% mutate(new = case_when(
  fc < -1.5 & padj <= 0.1 ~ 'dn_red',
  fc < -1.5 & padj >= 0.1 ~ 'dn_pink',
  fc > -1.5 & fc < 0 & padj <= 0.1 ~ 'dn_blue',
  fc > -1.5 & fc < 0 & padj >= 0.1 ~'dn_grey',
  fc > 1.5 & padj <= 0.1 ~ 'up_red',
  fc > 1.5 & padj >= 0.1 ~ 'up_pink',
  fc < 1.5 & fc > 0 & padj <= 0.1 ~ 'up_blue',
  fc < 1.5 & fc > 0 & padj >= 0.1 ~ 'up_grey',
  TRUE ~ 'others'
)) %>% count(new)

      new   n
1 dn_blue  20
2 dn_grey 127
3 dn_pink 328
4  dn_red  44
5 up_blue  18
6 up_grey 127
7 up_pink 296
8  up_red  40

或更好地使用janitor進行頻率計數

df %>% mutate(new = case_when(
  fc < -1.5 & padj <= 0.1 ~ 'dn_red',
  fc < -1.5 & padj >= 0.1 ~ 'dn_pink',
  fc > -1.5 & fc < 0 & padj <= 0.1 ~ 'dn_blue',
  fc > -1.5 & fc < 0 & padj >= 0.1 ~'dn_grey',
  fc > 1.5 & padj <= 0.1 ~ 'up_red',
  fc > 1.5 & padj >= 0.1 ~ 'up_pink',
  fc < 1.5 & fc > 0 & padj <= 0.1 ~ 'up_blue',
  fc < 1.5 & fc > 0 & padj >= 0.1 ~ 'up_grey',
  TRUE ~ 'others'
)) %>% janitor::tabyl(new) %>%
  janitor::adorn_totals()

     new    n percent
 dn_blue   20   0.020
 dn_grey  127   0.127
 dn_pink  328   0.328
  dn_red   44   0.044
 up_blue   18   0.018
 up_grey  127   0.127
 up_pink  296   0.296
  up_red   40   0.040
   Total 1000   1.000

暫無
暫無

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

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