簡體   English   中英

R中的數據分幀匯總統計

[英]Data framing summary statistics in R

我需要創建一個包含摘要統計信息的XLSX文件(如在summary()函數中),但我無法創建一種可靠的方法來將每個值(平均值、中位數、NA 等)分成單獨的行來自原始變量的變量。 由於我的數據庫有 200 多個變量,我確實需要創建一種更系統的方法,而不是手動刪除XLSX output 中的單詞。

經過一些研究,我找到了一些部分解決方案,例如:

x1 <- as.data.frame(do.call(cbind, lapply(df, summary, is.numeric)))
x2 <- data.frame(unclass(summary(df1)), check.names = FALSE, stringsAsFactors = FALSE)
x3 <- as.data.frame(apply(df,2,summary))
x4 <- data.frame(df1=matrix(df1),row.names=names(df1))

我需要的是這樣的:

          y1      y2      y3       y4       y5
Min.    1.00    1.00    23.00    50.00    6.00
1st Qu. 31.75   3.75    30.50    57.25    11.75
Median  43.00   7.00    56.00    76.00    15.00
Mean    51.75   6.10    55.55    72.05    14.35
3rd Qu. 80.25   8.25    73.50    83.75    17.00
Max.    99.00   10.00    100.00  95.00    20.00

如果有人想做一些練習,這個數據庫會給出與我的大數據庫相同的錯誤:

x1 <- rpois(20,5)
x2 <- rexp(20,2)
x3 <- rexp(20,5); x3[1:10] <- NA_real_
x4 <- runif(20,5,10)
x5 <- runif(20,5,12)
df1 <- data.frame(x1,x2,x3,x4,x5)

提前致謝!

考慮一個例子 dataframe 與列 y1, y2, ..., yn 總結:

library(tidyr)
library(dplyr)

data.frame(y1 = rnorm(100),
           y2 = runif(100) ##, ... yn
           ) %>%
pivot_longer(starts_with('y'),
             names_to = 'variable',
             values_to = 'value'
             ) %>%
    group_by(variable) %>%
    summarise(Min = min(value, na.rm = TRUE),
              Median = median(value, na.rm = TRUE) ##, ad libidum
              ) %>%
    pivot_longer(-variable) %>%
    pivot_wider(names_from = variable)

通常,package {broom} 提供方便的將摘要tidy成小標題的方法:

library(broom)
summary(1:10) %>% tidy
lm(displ ~ cyl, data = mpg) %>% tidy

或者,如果您想要寬表格式而不是長表格式(如您的示例所示):

library(broom)
library(tidyr)

summary(1:10) %>%
    tidy %>%
    pivot_longer(everything(),
                 names_to = 'stat',
                 values_to = 'value'
                 )

考慮將summary結果轉換為data.frame ,清理列,然后reshape output:

summary_raw <- summary(df1)

# SPLIT Freq COLUMN AND SUBSET OUT NA ROWS
summary_long <- within(
  data.frame(summary_raw), {
    Var2 <- trimws(Var2)
    Agg <- trimws(sapply(strsplit(Freq, ':'), "[", 1))
    Num <- as.numeric(sapply(strsplit(Freq, ':'), "[", 2))
    rm(Var1, Freq)
  }
) |> subset(
  !is.na(Agg) & !is.na(Num)
)

# RESHAPE TO WIDE
summary_wide <- reshape(
  summary_long,
  idvar = "Agg",
  v.names = "Num",
  timevar = "Var2",
  direction = "wide",
) |> `row.names<-`(NULL)

colnames(summary_wide) <- gsub(
    "Num\\.", "", names(summary_wide)
)

輸入

set.seed(43022)

x1 <- rpois(20,5)
x2 <- rexp(20,2)
x3 <- rexp(20,5); x3[1:10] <- NA_real_
x4 <- runif(20,5,10)
x5 <- runif(20,5,12)
df1 <- data.frame(x1,x2,x3,x4,x5)

Output

> summary_wide
      Agg    x1       x2        x3    x4     x5
1    Min.  1.00 0.003004  0.009565 5.034  6.240
2 1st Qu.  3.00 0.086428  0.020734 6.903  7.323
3  Median  4.00 0.279303  0.035791 7.829  9.492
4    Mean  4.85 0.323793  0.098930 7.780  9.125
5 3rd Qu.  6.25 0.548857  0.067267 8.622 10.685
6    Max. 12.00 0.928066  0.523284 9.908 11.867
7    NA's    NA       NA 10.000000    NA     NA

這里是一條線。

lapply(df1, summary) |> lapply(`length<-`, 6) |>  do.call(what=rbind) |> t() |> round(2)
#           x1   x2   x3   x4    x5
# Min.    1.00 0.03 0.03 5.23  5.48
# 1st Qu. 2.75 0.26 0.11 6.51  6.85
# Median  4.00 0.56 0.20 8.25  8.29
# Mean    4.55 0.57 0.24 7.94  8.29
# 3rd Qu. 6.00 0.70 0.28 9.43  9.57
# Max.    9.00 1.94 0.82 9.79 11.78

只需在lapply中使用summary ,將length t調整為6以刪除NA顯示, rbind ,轉置並round入它。 適用於您的示例中的數字數據。

注意: R >= 4.1 使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM