将数据框中的所有数字列四舍五入为不同的位数

Rounding off all numeric columns in data frame to different numbers of digits

我有一个包含许多不同列的数据框 类,我在下面包含了一个非常简化的示例:

df <- data.frame( col1=c("mary", "john", "luke", "peter", "agnes", "anne", "july", "judy", "tina", "ben"),
                  col2=c(0.1111,0.3123,0.7875,0.6789,0.87862,0.37512,0.69875,0.1785,0.1777, 0.9999),
                  col3=c(0.1111,0.3123,0.7875,0.6789,0.87862,0.37512,0.69875,0.1785,0.1777, 0.9999),
                  col3=c(124.6, 763.8, 222.9, 765.0, 564.7, 761.8, 683.9, 655.9, 897.3, 566.1))

我想四舍五入所有数字列,但取不同的值。例如:col2 和 col3 应四舍五入为 2 位数,col4 应四舍五入为 0 位数。

我想出的代码风格是这样的:

df2 <- df %>% mutate_at(2, round, 2)
df3 <- df2 %>% mutate_at(3, round, 2) 
df4 <- df3 %>% mutate_at(4, round, 0)

如果我每次都没有将值分配给新的数据框,它就不会将值保存到我的数据框中。 例如,如果我这样做:

df %>% mutate_at(2, round, 2)
df %>% mutate_at(3, round, 2) 
df %>% mutate_at(4, round, 0)

它将所需的输出写到控制台,但不将其保存到 df。我想知道是否有更优雅、更直观的方法来做到这一点?

您可以继续使用管道运算符将代码连接在一起。

df <- df %>% 
  mutate_at(c(2, 3), round, 2) %>%
  mutate_at(4, round, 0)

_at_all_if 变体现在被 across 取代,它还允许您在同一个 mutate 管道中输入多个操作。

library(dplyr)

df <- df %>%
        mutate(across(2:3, round, 2), 
               across(4, round, 0))
df

#    col1 col2 col3 col3.1
#1   mary 0.11 0.11    125
#2   john 0.31 0.31    764
#3   luke 0.79 0.79    223
#4  peter 0.68 0.68    765
#5  agnes 0.88 0.88    565
#6   anne 0.38 0.38    762
#7   july 0.70 0.70    684
#8   judy 0.18 0.18    656
#9   tina 0.18 0.18    897
#10   ben 1.00 1.00    566