将排除的变量保留在 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)。
在 dplyr
的 devel
版本中,我们可以将 summarise
与 across
一起使用,但仍然不确定 '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
如果我们需要第一行,那么mutate
和slice
第一行
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
我有一个数据帧(这只是完整帧的一个子集):
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)。
在 dplyr
的 devel
版本中,我们可以将 summarise
与 across
一起使用,但仍然不确定 '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
如果我们需要第一行,那么mutate
和slice
第一行
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