【问题标题】:Producing multiple frequency tables at once in R在 R 中一次生成多个频率表
【发布时间】:2020-11-25 08:46:47
【问题描述】:

我在列上有一个不同类型的变量(数字、字符、因子)的数据框,我想立即对其进行总结。我有一个 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 甚至可以使用相同的值重复,以便汇总观察结果。

【问题讨论】:

    标签: r dplyr summary


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2012-01-30
      • 2022-01-19
      • 2020-03-21
      • 1970-01-01
      相关资源
      最近更新 更多