🐘

Rによる要約統計量のデータフレームでの出力

2022/08/21に公開

はじめに

本記事では、Rによる要約統計量のデータフレームでの出力方法を紹介する。連続量における、n数, 欠測の数, 平均値, 中央値, 最小値, 最大値, 合計, 各パーセンタイル点を出力できる。またカテゴリカル変数のn数, 欠測の数, 頻度, 割合を出力できる。

Rにはsummary()をはじめ、パッケージでもtableoneやgtsummaryなど簡便な方法はたくさんある。ただ、もう少しシンプルな形式で値だけ欲しいことがあり簡単な関数を用意したので備忘録的にまとめた。

目次

  • Package
  • サンプルデータ作成
  • 関数の定義
    • 連続量(summary_means)
    • カテゴリカル変数(summary_freq)
  • 集計
    • 連続量の集計
    • 連続量の集計(層別)
    • カテゴリカル変数の集計
    • カテゴリカル変数の集計(層別)
  • まとめ
    • (メモ)今後、追加する可能性のある解析

Package

利用するPackageは以下の通り。

#package
library(tidyverse)
library(dplyr)

サンプルデータ作成

n=100で、正規分布に従う連続量a, bと2値変数c、1,2,3,4,5のいずれかをとるカテゴリカル変数dを作成した。ランダムに10%の値が欠測するようなデータになっている。

# dataset
a <- rnorm(100, mean=5, sd=3)
b <- rnorm(100, mean=3, sd=1)
c <- rbinom(100, 1, 0.5)
d <- ceiling(runif(100, min=0, max=5))
dat <- data.frame(a,b,c,d)

na <- as.data.frame(matrix(rbinom(100*4, 1, 0.9),ncol = 4))
na[na==0] <- NA

dat_na <- dat * na
head(dat_na)
##            a        b  c d
## 1 -0.3247013 3.229060  0 2
## 2  2.2131764       NA NA 4
## 3  4.1697254 2.462673  1 4
## 4  8.1885223 4.110458  0 2
## 5  6.7452800 3.015425  0 4
## 6  2.3057242       NA  1 5

関数の定義

連続量の集計に用いるsummary_meansと、カテゴリカル変数の集計に用いるsummary_freqを用意した。

連続量(summary_means)

summary_means(df,var_list,statistic,strata)は、dfにデータフレーム、var_listに集計したい変数、statisticに算出したい要約統計量、strataに層別変数をいれればよい。要約統計量は、summary_statistic_functionで定義したものであれば算出できる。

summary_statistic_function <- 
  list(
    n = ~n()-sum(is.na(.x)),
    na = ~sum(is.na(.x)),
    mean = ~mean(.x, na.rm = TRUE),
    median = ~median(.x, na.rm = TRUE),
    p50 = ~median(.x, na.rm = TRUE),
    var = ~var(.x, na.rm = TRUE),
    std = ~sd(.x, na.rm = TRUE),
    min = ~min(.x, na.rm = TRUE),
    max = ~max(.x, na.rm = TRUE),
    sum = ~sum(.x, na.rm = TRUE),
    p1 = ~quantile(.x,0.01, na.rm = TRUE),
    p5 = ~quantile(.x,0.05, na.rm = TRUE),
    p10 = ~quantile(.x,0.10, na.rm = TRUE),
    p25 = ~quantile(.x,0.25, na.rm = TRUE),
    p75 = ~quantile(.x,0.75, na.rm = TRUE),
    p90 = ~quantile(.x,0.90, na.rm = TRUE),
    p95 = ~quantile(.x,0.95, na.rm = TRUE),
    p99 = ~quantile(.x,0.99, na.rm = TRUE)
  )

summary_means <- function(df,var_list,statistic,strata=c()){
  result <- 
    df %>% group_by_at(strata) %>% 
    summarize(dplyr::across(var_list,summary_statistic_function[statistic]))
  return(result)
}

カテゴリカル変数(summary_freq)

summary_freq(df,var_list,maxdec)は、dfにデータフレーム、var_listに集計したい変数、maxdecに小数点以下の桁数を指定する。各変数の人数、欠測した人数、各カテゴリでの人数を集計する。あとは、その人数の割合も出力される。層別の場合は一旦含めていない。

summary_freq <- function(df,var_list,maxdec=2){
  result <- c()
  
  for (i in 1:length(var_list)) {
    temp <- df[,var_list[i]]
    
    levels <- names(table(temp,useNA="always"))
    freq <- as.vector(table(temp,useNA="always"))
    ntotal <- sum(freq)
    n <- sum(freq) - sum(is.na(temp))
    prop_ntotal <- round(freq / ntotal,maxdec)
    prop_n <- round(freq / n,maxdec)
    
    re <- data.frame(
      "Var" = var_list[i],
      "level" = levels,
      "freq" = freq,
      "ntotal" = ntotal,
      "n" = n,
      "prop_ntotal" = prop_ntotal,
      "prop_n" = prop_n)
    
    result <- rbind(result,re)}
  result$prop_n <- ifelse(is.na(result$level), NA, result$prop_n)
  return(result)
}

集計

連続量の集計

a, bについて、欠測していない人数、欠測、平均値、標準偏差、合計を算出した。

summary_means(dat_na,c("a","b"),c("n","na","mean","std","sum"))
## # A tibble: 1 x 10
##     a_n  a_na a_mean a_std a_sum   b_n  b_na b_mean b_std b_sum
##   <int> <int>  <dbl> <dbl> <dbl> <int> <int>  <dbl> <dbl> <dbl>
## 1    93     7   4.66  3.19  433.    91     9   3.17 0.954  288.

連続量の集計(層別)

a, bについて、cで層別して欠測していない人数、欠測、平均値、標準偏差を算出した。

var <- c("a","b")
stat <- c("n","na","mean","std")
by <- c("c")
summary_means(dat_na,var,stat,by)
## # A tibble: 3 x 9
##       c   a_n  a_na a_mean a_std   b_n  b_na b_mean b_std
##   <int> <int> <int>  <dbl> <dbl> <int> <int>  <dbl> <dbl>
## 1     0    37     2   5.02  3.26    37     2   3.12 0.936
## 2     1    48     2   4.47  3.22    46     4   3.18 0.932
## 3    NA     8     3   4.15  2.87     8     3   3.31 1.26

カテゴリカル変数の集計

c, dについて各変数のlevelごとに人数を集計した。

summary_freq(dat_na,c("c","d"))
##   Var level freq ntotal  n prop_ntotal prop_n
## 1   c     0   39    100 89        0.39   0.44
## 2   c     1   50    100 89        0.50   0.56
## 3   c  <NA>   11    100 89        0.11     NA
## 4   d     1   17    100 89        0.17   0.19
## 5   d     2   17    100 89        0.17   0.19
## 6   d     3   20    100 89        0.20   0.22
## 7   d     4   19    100 89        0.19   0.21
## 8   d     5   16    100 89        0.16   0.18
## 9   d  <NA>   11    100 89        0.11     NA

カテゴリカル変数の集計(層別)

層別に集計したい場合には、次のプログラムで人数を計算することはできる。

strata <- c("c","d")
dat_na %>% group_by_at(strata) %>% 
  summarize(freq = n()) 
## # A tibble: 16 x 3
## # Groups:   c [3]
##        c     d  freq
##    <int> <dbl> <int>
##  1     0     1     6
##  2     0     2     6
##  3     0     3    10
##  4     0     4     5
##  5     0     5     6
##  6     0    NA     6
##  7     1     1     9
##  8     1     2     8
##  9     1     3    10
## 10     1     4    11
## 11     1     5    10
## 12     1    NA     2
## 13    NA     1     2
## 14    NA     2     3
## 15    NA     4     3
## 16    NA    NA     3

まとめ

本記事では、連続量とカテゴリカル変数でしばしば利用される要約統計量の値をデータフレームとして取得する方法を紹介した。

もし記事内に誤りが見つかった場合には、コメント等でご連絡下さい。

(メモ)今後、追加する可能性のある内容

  • カテゴリカル変数(層別)を関数に含める
  • カテゴリカル変数のクロス表の作成

サポートして頂けるとモチベーションに繋がりますのでぜひ宜しくお願いします。データ解析や臨床研究でのご相談があれば、お気軽にTwiiterもしくはメールにてご連絡下さい。

作成者:Masahiro Kondo
作成日:2022/8/21
連絡先:m.kondo1042(at)gmail.com

Discussion