通过 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 聚合 - 将单个列从因子变为数字的主要内容,如果未能解决你的问题,请参考以下文章
bind_rows_(x, .id) 中的错误:无法将列从因子转换为数字
将多个列变为函数会为dplyr中的结果列内的每个组件创建一个列表