总结一下——它是否依赖于顺序?

summarize across -- is it order dependent?

我在 dplyracross 中遇到了一些奇怪的事情,或者至少是我不明白的事情。

如果我们使用 across 函数跨多个列计算 meanstandard error of the mean,我很想使用以下命令:

mtcars %>% group_by(gear) %>% select(mpg,cyl) %>%
  summarize(across(everything(), ~mean(.x, na.rm = TRUE), .names = "{col}"),
            across(everything(), ~sd(.x, na.rm=T)/sqrt(sum(!is.na(.x))), .names="se_{col}")) %>% head()

结果是

   gear   mpg   cyl se_mpg se_cyl
  <dbl> <dbl> <dbl>  <dbl>  <dbl>
1     3  16.1  7.47     NA     NA
2     4  24.5  4.67     NA     NA
3     5  21.4  6        NA     NA

但是,如果我切换各个 across 命令的顺序,我会得到以下结果:

mtcars %>% group_by(gear) %>% select(mpg,cyl) %>%
  summarize(across(everything(), ~sd(.x, na.rm=T)/sqrt(sum(!is.na(.x))), .names="se_{col}"),
            across(everything(), ~mean(.x, na.rm = TRUE), .names = "{col}")) %>% head()

# A tibble: 3 x 5
   gear se_mpg se_cyl   mpg   cyl
  <dbl>  <dbl>  <dbl> <dbl> <dbl>
1     3  0.871  0.307  16.1  7.47
2     4  1.52   0.284  24.5  4.67
3     5  2.98   0.894  21.4  6   

为什么会这样?跟我使用everything()有关系吗?在我的情况下,我希望计算数据集中每个变量的 meanstandard error of the mean

我不知道为什么 summarize 会这样,这可能是由于两个 across 函数的潜在交互(尽管我觉得这很奇怪)。无论如何,我建议您编写一个 across 语句并使用 across documentation.

建议的 lambda 函数列表

这样一来,不管第一个函数是均值还是标准差,你都不会得到 NA。

mtcars %>% 
  group_by(gear) %>% 
  select(mpg, cyl) %>% 
  summarize(across(everything(), list(
    mean = ~mean(.x, na.rm = TRUE),
    se = ~sd(.x, na.rm = TRUE)/sqrt(sum(!is.na(.x)))
  ), .names = "{fn}_{col}"))

# A tibble: 3 x 5
#    gear mean_mpg se_mpg mean_cyl se_cyl
#   <dbl>    <dbl>  <dbl>    <dbl>  <dbl>
# 1     3     16.1  0.871     7.47  0.307
# 2     4     24.5  1.52      4.67  0.284
# 3     5     21.4  2.98      6     0.894



mtcars %>% 
  group_by(gear) %>% 
  select(mpg, cyl) %>% 
  summarize(across(everything(), list(
    se = ~sd(.x, na.rm = TRUE)/sqrt(sum(!is.na(.x))),
    mean = ~mean(.x, na.rm = TRUE)
  ), .names = "{fn}_{col}"))

# A tibble: 3 x 5
#    gear se_mpg mean_mpg se_cyl mean_cyl
#  <dbl>  <dbl>    <dbl>  <dbl>    <dbl>
# 1     3  0.871     16.1  0.307     7.47
# 2     4  1.52      24.5  0.284     4.67
# 3     5  2.98      21.4  0.894     6