gpt4 book ai didi

r - 为什么在 R 中使用 `format()` 和 `dplyr` 会出现奇怪的行为?

转载 作者:行者123 更新时间:2023-12-02 01:53:09 25 4
gpt4 key购买 nike

我正在尝试使用 dplyr %>% 管道将数值四舍五入并格式化为小数点后有 2 位数字(例如 2.43、1.05)。但是,format() 函数在以下两个数据示例(df_summarizedf_groupby)中具有不同的行为。 df_summarize 的输出是正确的,但是 df_groupby 的输出不正确,我想知道有线行为的原因是什么。是因为分组效应还是其他原因?

如有任何建议,我们将不胜感激。

library(tidyverse)

df <- data.frame(cate = sample(c("A", "B"), size = 5, replace = T),
v1 = runif(5, 1.001, 5.005),
v2 = runif(5, 1.001, 5.005))

df_summarize <- df %>% summarise(mean_v1 = mean(v1),
mean_v2 = mean(v2)) %>%
round(2) %>% format(nsmall = 2)

# mean_v1 mean_v2
# 1 3.94 2.08

df_groupby <- df %>% group_by(cate) %>%
summarise(p1 = mean(v1), p2 = mean(v2)) %>%
select(-cate) %>% ungroup() %>%
round(2) %>% format(nsmall = 2)

# [1] "\033[38;5;246m# A tibble: 2 × 2\033[39m"
# [2] " p1 p2"
# [3] " \033[3m\033[38;5;246m<dbl>\033[39m\033[23m \033[3m\033[38;5;246m<dbl>\033[39m\033[23m"
# [4] "\033[38;5;250m1\033[39m 4.01 2.17"
# [5] "\033[38;5;250m2\033[39m 3.67 1.69"

最佳答案

原因是 format 有一个 data.frame 方法,它不同于 format.tbl 方法(调用 pillar::format_tbl 其中提到 'x' 作为 要格式化或打印的对象。)对于 formattibble。在第一种情况下,当没有group_by时,它不会将数据更改为tibble,而使用group_by时,它会更改为tibble 这会导致问题

library(dplyr)
df %>%
group_by(cate) %>%
summarise(p1 = mean(v1), p2 = mean(v2)) %>%
select(-cate) %>%
round(2) %>%
as.data.frame %>% # add the `as.data.frame`
format(nsmall = 2)

-输出

  p1   p2
1 3.02 2.86
2 3.20 3.74

在第一种情况下,检查str

> df %>%
summarise(mean_v1 = mean(v1),
mean_v2 = mean(v2)) %>%
round(2)%>%
str
'data.frame': 1 obs. of 2 variables:
$ mean_v1: num 3.09
$ mean_v2: num 3.21

而使用 group_by

> df %>%
group_by(cate) %>%
summarise(p1 = mean(v1), p2 = mean(v2)) %>%
select(-cate) %>%
round(2) %>%
str
tibble [2 × 2] (S3: tbl_df/tbl/data.frame)
$ p1: num [1:2] 3.02 3.2
$ p2: num [1:2] 2.86 3.74

?group_by的文档中也有提到

A grouped data frame with class grouped_df, unless the combination of ... and add yields a empty set of grouping columns, in which case a tibble will be returned.


如果我们想在 tibble 上使用 format,请尝试使用 across

df %>%
group_by(cate) %>%
summarise(p1 = mean(v1), p2 = mean(v2)) %>%
select(-cate) %>%
round(2) %>%
mutate(across(everything(), format, nsmall = 2))

-输出

# A tibble: 2 × 2
p1 p2
<chr> <chr>
1 3.02 2.86
2 3.20 3.74

关于r - 为什么在 R 中使用 `format()` 和 `dplyr` 会出现奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69956541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com