r - 如何使用 dplyr::mutate_all 对选定列进行舍入

标签 r dplyr

我正在使用以下软件包版本

# devtools::install_github("hadley/dplyr")
> packageVersion("dplyr")
[1] ‘0.5.0.9001’

带有以下小标题:

library(dplyr)
df  <- structure(list(gene_symbol = structure(1:6, .Label = c("0610005C13Rik", 
"0610007P14Rik", "0610009B22Rik", "0610009L18Rik", "0610009O20Rik", 
"0610010B08Rik"), class = "factor"), fold_change = c(1.54037, 
1.10976, 0.785, 0.79852, 0.91615, 0.87931), pvalue = c(0.5312, 
0.00033, 0, 0.00011, 0.00387, 0.01455), ctr.mean_exp = c(0.00583, 
59.67286, 83.2847, 6.88321, 14.67696, 1.10363), tre.mean_exp = c(0.00899, 
66.22232, 65.37819, 5.49638, 13.4463, 0.97043), ctr.cv = c(5.49291, 
0.20263, 0.17445, 0.46288, 0.2543, 0.39564), tre.cv = c(6.06505, 
0.28827, 0.33958, 0.53295, 0.26679, 0.52364)), .Names = c("gene_symbol", 
"fold_change", "pvalue", "ctr.mean_exp", "tre.mean_exp", "ctr.cv", 
"tre.cv"), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
"data.frame"))

看起来像这样:

> df
# A tibble: 6 × 7
    gene_symbol fold_change  pvalue ctr.mean_exp tre.mean_exp  ctr.cv  tre.cv
         <fctr>       <dbl>   <dbl>        <dbl>        <dbl>   <dbl>   <dbl>
1 0610005C13Rik     1.54037 0.53120      0.00583      0.00899 5.49291 6.06505
2 0610007P14Rik     1.10976 0.00033     59.67286     66.22232 0.20263 0.28827
3 0610009B22Rik     0.78500 0.00000     83.28470     65.37819 0.17445 0.33958
4 0610009L18Rik     0.79852 0.00011      6.88321      5.49638 0.46288 0.53295
5 0610009O20Rik     0.91615 0.00387     14.67696     13.44630 0.25430 0.26679
6 0610010B08Rik     0.87931 0.01455      1.10363      0.97043 0.39564 0.52364

我想将 float (从第 2 列开始)四舍五入为 3 位数字。使用 dplyr::mutate_all() 的方法是什么?

我尝试过这个:

cols <- names(df)[2:7]
# df <- df %>% mutate_each_(funs(round(.,3)), cols)
# Warning message:
#'mutate_each_' is deprecated.
# Use 'mutate_all' instead.
# See help("Deprecated") 

df <- df %>% mutate_all(funs(round(.,3)), cols)

但出现以下错误:

Error in mutate_impl(.data, dots) : 
  3 arguments passed to 'round'which requires 1 or 2 arguments

最佳答案

虽然新的 across() 函数比以前的 mutate_if 变体稍微详细一些,但 dplyr 1.0.0 更新使 tidyverse语言和代码更加一致和通用。

这是对指定列进行舍入的方法:

df %>% mutate(across(2:7, round, 3)) # 第 2-7 列(按位置)

df %>% mutate(across(cols, round, 3)) # 由变量 cols 指定的列

这是如何将所有数字列四舍五入到小数点后 3 位:

df %>% mutate(across(where(is.numeric), round, 3))

这是对所有列进行四舍五入的方法,但在这种情况下不起作用,因为gene_symbol不是数字:

df %>% mutate(across(everything(), round, 3))

我们将 where(is.numeric) 放在 across 的参数中,您可以放入其他列规范,例如 -1-gene_symbol 排除第 1 列。有关更多选项,请参阅 help(tidyselect)

<小时/>

dplyr 1.0.0 更新

across() 函数替换了 dplyr 动词的 _if/_all/_at/_each 变体。 https://dplyr.tidyverse.org/dev/articles/colwise.html#how-do-you-convert-existing-code

<小时/>

由于某些列不是数字,因此您可以使用 mutate_if 来四舍五入列,当且仅当它是数字时:

df %>% mutate_if(is.numeric, round, 3)

关于r - 如何使用 dplyr::mutate_all 对选定列进行舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43314328/

相关文章:

r - 在两个或多个变量上使用 Melt() 时,如何保留串联变量的两个部分? (数据.表::熔化())

r - 尝试在 R 中合并多个 csv 文件

r - 将第 1-12 周改为第 1 季度

r - 如何在R中重复观察n次?

r - R分组显示所有因子水平的计数,即使在dplyr为零时

R- 在 Rmarkdown 中绘图时文件名无效错误

r - 如何在 xpath 中的不同类上使用 contains 和 not contains

r - magrittr 包中的管道不适用于函数 rm()

r - 在 r 中将 2 列(从长形式转换为宽形式)扩展为 4 列

r - 具有比 R 中的观察值更多级别的因子的数据框