将排除的变量保留在 summarise_at 中

Keeping excluded variables in summarise_at

我有一个数据帧(这只是完整帧的一个子集):

Depth <- seq(0, 2, 0.2)
cps <- sample(48000:52000, 11)
Al <- rnorm(11)
Si <- rnorm(11)
Fe <- rnorm(11)

df <- as_tibble(cbind(Depth, cps, Al, Si, Fe))

当我使用 mutate_at 只对选定的变量执行函数时,最终的 df 仍然包含我选择排除的变量。所以,

df_norm <- df %>%
mutate_at(vars(-c(Depth, cps)), ~abs(log(./df$cps)))

对 Al、Si、Fe 执行函数,df_norm 仍然是一个 11x5 tibble,深度和 cps 与 df 没有变化。但是,当我用 summarise_at:

做类似的动作时
df_mean <- df %>%
summarise_at(vars(-c(Depth, cps)), mean)

生成的数据帧只有 1x3 而不是 1x5,即它删除了 Depth 和 cps 而不是仅仅忽略它们进行平均。我应该以不同的方式编写 vars 参数来保留这些参数吗?

编辑 我希望我的输出是单个观察值(向量),所有 5 个变量 [1,5] 都处于中值深度值(在本例中为 1)。

dplyrdevel 版本中,我们可以将 summariseacross 一起使用,但仍然不确定 'Depth' 需要什么值, 'cps',所以转换为list

library(dplyr)
df %>%
    summarise(across(Al:Fe, mean), across(Depth:cps, list))
# A tibble: 1 x 5
#     Al     Si     Fe Depth      cps       
#   <dbl>  <dbl>  <dbl> <list>     <list>    
#1 -0.438 -0.118 -0.590 <dbl [11]> <dbl [11]>

或获取第 first

df %>%
    summarise(across(Al:Fe, mean), across(Depth:cps, first))
# A tibble: 1 x 5
#      Al     Si     Fe Depth   cps
#  <dbl>  <dbl>  <dbl> <dbl> <dbl>
#1 -0.438 -0.118 -0.590     0 51432

或对 'Depth'

median 元素进行子集化
df %>% 
    summarise(across(Al:Fe, mean), across(Depth:cps, ~ .[Depth == median(Depth)]))
# A tibble: 1 x 5
#      Al     Si     Fe Depth   cps
#   <dbl>  <dbl>  <dbl> <dbl> <dbl>
#1 -0.438 -0.118 -0.590     1 51753

如果我们需要第一行,那么mutateslice第一行

df %>%
    mutate_at(vars(-c(Depth, cps)), mean) %>%
    slice(1)
# A tibble: 1 x 5
#  Depth   cps     Al     Si     Fe
#  <dbl> <dbl>  <dbl>  <dbl>  <dbl>
#1     0 51432 -0.438 -0.118 -0.590

或者如果它需要成为 median

df %>%
  mutate_at(vars(-c(Depth, cps)), mean) %>%
  filter(Depth == median(Depth))
# A tibble: 1 x 5
# Depth   cps     Al     Si     Fe
#   <dbl> <dbl>  <dbl>  <dbl>  <dbl>
#1     1 51753 -0.438 -0.118 -0.590