Одновременное создание нескольких таблиц частот в R

#r #dplyr #summary

#r #dplyr #Краткие сведения

Вопрос:

У меня есть фрейм данных с переменными разного типа (числовыми, символьными, коэффициентами) в столбцах, которые я бы хотел сразу суммировать. У меня есть столбец ID, который нужно подсчитывать в соответствии с уровнями других столбцов.

Каждый столбец имеет разные уровни, если они являются символами или факторами, и я хотел бы знать частоту идентификаторов для каждого уровня. Кроме того, если столбец является числовым, я хотел бы вернуть сводную статистику, такую как среднее значение, sd и квантили.

В идеале я бы сделал это с dplyr group_by() summarise() помощью функций with и, но для этого мне нужно группировать каждый столбец за раз, а затем указывать, хочу ли я, чтобы он считался с n() помощью или мне нужна сводная статистика из-за того, что она числовая. В SAS нем есть команда, известная как PROC FREQ , которую я пытаюсь воспроизвести.

 df<-
  data.frame(
  ID = c(1,2,3,4,5,6),
  Age = c(20, 30, 45, 60, 70, 18),
  Car = c("Zum", "Yat", "Zum", "Zum", "Yat", "Rel"),
  Side = c("Left", "Right", "Left", "Left", "Right", "Right")
)
 

Результат:

  df %>% group_by(Car) %>% summarise(n = n())
 df %>% group_by(Side) %>% summarise(n = n())
 df %>% summarise(mean = mean(Age))
 
 

Я хотел бы получить этот результат в одном выводе и для многих переменных. Мой реальный df содержит десятки столбцов, которые должны либо группировать переменные, либо нет, в зависимости от их природы. Кроме того ID , они могут быть даже повторены с теми же значениями для суммирования наблюдений.

Ответ №1:

Вы могли бы написать функцию для выполнения действий на основе ее класса. Здесь мы вычисляем среднее значение, если класс столбца числовой или выполняется count из уникальных значений в столбце.

 library(dplyr)

purrr::map(names(df)[-1], function(x) {
  if(is.numeric(df[[x]])) df %>% summarise(mean = mean(.data[[x]]))
  else df %>% count(.data[[x]])
})

#[[1]]
#  mean
#1 40.5

#[[2]]
#  Car n
#1 Rel 1
#2 Yat 2
#3 Zum 3

#[[3]]
#   Side n
#1  Left 3
#2 Right 3