Хранение исключенных переменных в summarise_at - PullRequest
1 голос
/ 09 марта 2020

У меня есть датафрейм (это всего лишь подмножество полного кадра):

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 с глубиной и cps, не изменяющимися от df. Тем не менее, когда я делаю аналогичный ход с summarise_at:

df_mean <- df %>%
summarise_at(vars(-c(Depth, cps)), mean)

, результирующий фрейм данных составляет только 1x3 вместо 1x5, т.е. он удаляет Depth и cps вместо того, чтобы просто игнорировать их для усреднения. Есть ли другой способ, которым я должен написать аргумент vars, чтобы сохранить их?

РЕДАКТИРОВАТЬ Я бы хотел, чтобы мой вывод был одним наблюдением (вектором) со всеми 5 переменными [1,5] при медианном значении глубины (в данном случае 1).

1 Ответ

1 голос
/ 09 марта 2020

В devel версии dplyr мы можем использовать 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

Или для подстановки элемента median в 'Depth'

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
...