【问题标题】:Summarize counts based on multiple conditions根据多个条件汇总计数
【发布时间】:2021-07-20 16:50:08
【问题描述】:

我正在尝试根据两个变量的组合来汇总我的数据。 以下代码用于处理数据:

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。但是,您在代码中使用的是, 而不是&amp;,这就是它会产生一些重叠的原因。因此,建议创建一个颜色变量并在之后使用其count()。不确定您要做什么?

标签: r tidyverse


【解决方案1】:

您可能想要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

但这会造成重叠。因此,您需要在逻辑条件下将, 替换为&amp;|,视情况而定。见。

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 数据点分成八种颜色。请改用此代码

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

【讨论】:

  • 这会产生不同的结果(计数也超过了总观察值)。下面是一个例子:df %&gt;% summarise(dn_pink = sum(fc &lt; -1.5, padj &gt;= 0.1)) 给出 1233,而df %&gt;% count(fc &lt; -1.5, padj &gt;= 0.1) 返回 316,当这两个条件都为 TRUE 时。
  • 没关系,我只需要将 , 替换为 &amp;
猜你喜欢
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2013-10-11
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2016-10-12
相关资源
最近更新 更多