[英]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.