我需要創建一個XLSX包含匯總統計資訊的檔案(如在summary()函式中),但我無法創建一種可靠的方法將每個值(平均值、中位數、NA 等)從原始的每個變數中分離成單獨的行變數。由于我的資料庫有 200 多個變數,我確實需要創建一種更系統的方式,而不是手動洗掉XLSX輸出中的單詞。
經過一番研究,我找到了一些部分解決方案,例如:
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)
提前致謝!
uj5u.com熱心網友回復:
考慮一個帶有 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)
一般來說,包 {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'
)
uj5u.com熱心網友回復:
考慮將summary結果轉換為data.frame,清理列,然后reshape輸出:
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)
輸出
> 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
uj5u.com熱心網友回復:
這里是單線。
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
只需summary在 an 中使用lapply,將lengths 調整6為洗掉NA顯示rbind,,transpose 和round它。適用于您的示例中的數字資料。
注意:使用 R >= 4.1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/469441.html
上一篇:沒有資料刮掉w/Rvest包?
下一篇:格羅布根本沒有繪制或位置錯誤
