R语言将summary()统计结果转换为纯数值格式data.table的实现方法
R中将summary输出转换为纯数值data.table的实现方法
问题背景
执行summary(my_data)后得到如下统计结果:
year quarter employed newhires separations jobscreated jobsdestroyed Min. :1990 Min. :1.000 Min. : 6976 Min. : 2321 Min. : 1922 Min. : 1091 Min. : 520 1st Qu.:2000 1st Qu.:2.000 1st Qu.: 28049 1st Qu.: 16858 1st Qu.: 13912 1st Qu.: 6595 1st Qu.: 3862 Median :2003 Median :3.000 Median : 64836 Median : 39188 Median : 32018 Median : 14148 Median : 7727 Mean :2003 Mean :2.509 Mean : 94468 Mean : 59336 Mean : 48973 Mean : 22036 Mean :11843 3rd Qu.:2007 3rd Qu.:4.000 3rd Qu.:121905 3rd Qu.: 75960 3rd Qu.: 61976 3rd Qu.: 26829 3rd Qu.:14993 Max. :2010 Max. :4.000 Max. :571419 Max. :448423 Max. :391454 Max. :166022 Max. :80338 NA's :49 NA's :49 NA's :49
需求目标
需要将上述输出转换为指定格式的data.table,要求:
- 所有单元格仅保留最小值、第一四分位数、中位数、均值、第三四分位数、最大值、缺失值数量的原始数值
- 统计指标名称作为行名
目标格式示意:
year quarter employed newhires separations jobscreated jobsdestroyed Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
现有问题
使用如下代码转换时,输出的每个单元格都附带了Min.、1st Qu.等前缀标签,无法得到纯数值:
data.frame(unclass(summary(my_data)), check.names = FALSE, stringsAsFactors = FALSE)
当前错误输出效果:
year quarter employed newhires separations jobscreated jobsdestroyed X Min. :1990 Min. :1.000 Min. : 6976 Min. : 2321 Min. : 1922 Min. : 1091 Min. : 520 X.1 1st Qu.:2000 1st Qu.:2.000 1st Qu.: 28049 1st Qu.: 16858 1st Qu.: 13912 1st Qu.: 6595 1st Qu.: 3862 X.2 Median :2003 Median :3.000 Median : 64836 Median : 39188 Median : 32018 Median : 14148 Median : 7727 X.3 Mean :2003 Mean :2.509 Mean : 94468 Mean : 59336 Mean : 48973 Mean : 22036 Mean :11843 X.4 3rd Qu.:2007 3rd Qu.:4.000 3rd Qu.:121905 3rd Qu.: 75960 3rd Qu.: 61976 3rd Qu.: 26829 3rd Qu.:14993 X.5 Max. :2010 Max. :4.000 Max. :571419 Max. :448423 Max. :391454 Max. :166022 Max. :80338 X.6 <NA> <NA> <NA> NA's :49 <NA> NA's :49 NA's :49
解决方案
方案1:直接基于summary()结果生成目标表格(推荐,无需文本清洗)
直接从原始数据计算统计量,避免后续清洗步骤,代码如下:
library(data.table) # 计算核心统计量(最小值、1/4分位、中位数、均值、3/4分位、最大值) sum_dt <- as.data.table(t(apply(my_data, 2, summary, na.rm = TRUE)), keep.rownames = "字段名") # 补充缺失值计数行 na_count <- colSums(is.na(my_data)) sum_dt <- rbind(sum_dt, data.table(字段名 = "NA's", as.list(na_count))) # 若需要统计指标作为行名,执行以下代码: # sum_dt <- transpose(sum_dt, keep.names = "统计指标", make.names = "字段名")
方案2:对现有带标签的输出做文本清洗提取数值
如果已经生成了带标签的中间结果,可以用正则表达式提取冒号后的数值,代码如下:
library(data.table) library(stringr) # 假设带标签的中间结果存储在raw_sum_df中 raw_sum_df <- data.frame(unclass(summary(my_data)), check.names = FALSE, stringsAsFactors = FALSE) # 逐列提取冒号后的数值 clean_dt <- as.data.table(lapply(raw_sum_df, function(x) { as.numeric(str_extract(x, "(?<=:)[\\d.]+")) })) # 补充行名与缺失值计数 rownames(clean_dt) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.", "NA's") clean_dt["NA's", ] <- colSums(is.na(my_data))
内容的提问来源于stack exchange,提问作者AaronSzcz
相关产品推荐
相关产品推荐

