通过 dplyr 聚合 - 将单个列从因子变为数字

Posted

技术标签:

【中文标题】通过 dplyr 聚合 - 将单个列从因子变为数字【英文标题】:Aggregating via dplyr - mutating a single column from factor to numeric 【发布时间】:2018-11-05 01:23:09 【问题描述】:

您好,感谢您的阅读。

我一直在尝试聚合一些数据,并且已经能够通过聚合函数成功地做到这一点,但我也想尝试通过使用 dplyr 运行管道来做同样的事情 - 但是我一直收到错误消息:

mutate_impl(.data, dots) 中的错误:评估错误:无法 找到函数“15.2”。

我目前有这个数据集p:

    sample    gene           ct
1    s001     gapdh         15.2
2    s001     gapdh           16
3    s001     gapdh         14.8
4    s002     gapdh         16.2
5    s002     gapdh           17
6    s002     gapdh         16.7
7    s003     gapdh Undetermined
8    s003     gapdh         14.6
9    s003     gapdh           15
10   s001      actb         24.5
11   s001      actb         24.2 
12   s001      actb         24.7
13   s002      actb           25
14   s002      actb         25.7
15   s002      actb         25.5
16   s003      actb         27.3
17   s003      actb         27.4
18   s003      actb Undetermined

并希望它得到它:

  p2$sample p2$gene  p2$ct.mean    p2$ct.sd
1      s001    actb 24.46666667  0.25166115
2      s002    actb 25.40000000  0.36055513
3      s003    actb 27.35000000  0.07071068
4      s001   gapdh 15.33333333  0.61101009
5      s002   gapdh 16.63333333  0.40414519
6      s003   gapdh 14.80000000  0.28284271

我当前使用的导致上述错误的代码:

library(dplyr)

p_ave_sd <- p %>% 
  filter(p$ct != "Undetermined") %>%
  mutate_at(as.character(p$ct), as.numeric, rm.na = TRUE) %>%
  group_by(p$gene) %>% 
  summarise(mean=mean(p$ct), sd=sd(p$ct))

这绝对是“变异”步骤让我感到困惑,我尝试了 mutate_all()、mutate_if(is.factor, is.numeric) 等,但每个都有自己的错误。

感谢您的帮助!

【问题讨论】:

为什么在dplyr 语句中使用p$ 你是对的,它们不是必需的,它们正在触发 mutate 函数。但是“mutate(as.numeric(ct)”仍然没有将 ct 更改为数字。 【参考方案1】:

这里是使用mutate_at的方法。如果您只有一列要转换,mutate 也可以使用并且更直接。

library(dplyr)

dat2 <- dat %>%
  filter(!ct %in% "Undetermined") %>%
  # mutate(ct = as.numeric(ct)) %>% <<< This will also work
  mutate_at(vars(ct), funs(as.numeric(.))) %>%
  group_by(sample, gene) %>% 
  summarise(mean = mean(ct), sd = sd(ct)) %>%
  ungroup()

dat2
# # A tibble: 6 x 4
#   sample gene   mean     sd
#   <chr>  <chr> <dbl>  <dbl>
# 1 s001   actb   24.5 0.252 
# 2 s001   gapdh  15.3 0.611 
# 3 s002   actb   25.4 0.361 
# 4 s002   gapdh  16.6 0.404 
# 5 s003   actb   27.4 0.0707
# 6 s003   gapdh  14.8 0.283 

数据

dat <- read.table(text = "    sample    gene           ct
1    s001     gapdh         15.2
                  2    s001     gapdh           16
                  3    s001     gapdh         14.8
                  4    s002     gapdh         16.2
                  5    s002     gapdh           17
                  6    s002     gapdh         16.7
                  7    s003     gapdh Undetermined
                  8    s003     gapdh         14.6
                  9    s003     gapdh           15
                  10   s001      actb         24.5
                  11   s001      actb         24.2 
                  12   s001      actb         24.7
                  13   s002      actb           25
                  14   s002      actb         25.7
                  15   s002      actb         25.5
                  16   s003      actb         27.3
                  17   s003      actb         27.4
                  18   s003      actb Undetermined",
                  header = TRUE, stringsAsFactors = FALSE)

【讨论】:

这确实成功了,感谢您帮助修复和教授新知识! =)【参考方案2】:

我不确定我是否理解您的问题,但可能是:

p_ave_sd <- p %>% 
   filter(ct != "undetermined") %>%
   mutate(ct=as.numeric(ct)) %>%
   group_by(gene,sample) %>% 
   summarise(mean=mean(ct), sd=sd(ct))

【讨论】:

以上是关于通过 dplyr 聚合 - 将单个列从因子变为数字的主要内容,如果未能解决你的问题,请参考以下文章

如何将data.frame列从因子转换为数字[重复]

bind_rows_(x, .id) 中的错误:无法将列从因子转换为数字

将多个列变为函数会为dplyr中的结果列内的每个组件创建一个列表

按其他列因子聚合列[重复]

如何使用 dplyr 将跨因子级别的分组计数保存到新变量中?

在具有多个因子(字符)变量的数据框中聚合(小计)