在 R 中一次生成多个频率表

Producing multiple frequency tables at once in R

我在列上有一个包含不同类型变量(数字、字符、因子)的数据框,我想立即对其进行总结。我有一个 ID 列要根据其他列的级别进行计数。

如果每列是字符或因子,它们都有不同的级别,我想知道每个级别的 ID 频率。此外,如果该列是数字,我希望返回摘要统计信息,例如均值、标准差和分位数。

理想情况下,我会使用 dplyrgroup_by()summarise() 函数来执行此操作,但它需要我一次对每一列进行分组,然后指定是否要用 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 甚至可以重复使用相同的值来汇总观察结果。

您可以编写一个函数来根据它的 class 采取行动。在这里,如果列的 class 是数字,我们计算平均值,否则计算列中唯一值的 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