R脚本中summary输出格式不一致,如何实现统一?
问题:如何让R中
summary()输出数值统计而非频数分布? 原始代码
data <- read.csv(args[1]); s <- summary(data$Latency); cpuIdle <- read.csv(args[2]); cpuBusy <- sapply(cpuIdle$value, function(x) { 100-x; }); cpuSum <- summary(cpuBusy); print(cpuSum); print(s);
现象描述
cpuSum输出符合预期的数值统计:
Min. 1st Qu. Median Mean 3rd Qu. Max. 3.00 9.50 15.00 13.18 18.00 18.00
s却输出频数统计(不符合预期):
1 0 3 2 4 5 6 7 8 9 1028641 860772 486388 407815 367286 220960 111822 47377 19483 10219 10 11 12 13 14 15 31 30 29 28 6666 4460 3081 2181 1523 1077 940 918 914 893 33 32 27 26 34 16 35 36 25 37 888 886 858 786 786 771 700 679 671 621 17 24 38 39 23 40 18 41 19 22 570 563 490 457 436 428 410 370 326 304 21 20 42 43 44 45 46 47 48 50 303 286 270 269 214 185 159 133 117 105 49 51 52 54 53 55 57 56 81 82 103 75 65 54 53 39 38 34 29 28 207 86 206 79 78 59 80 64 83 85 27 27 26 25 23 22 21 20 18 18 60 63 73 84 87 205 58 72 75 76 17 17 17 17 17 16 16 16 16 15 88 89 91 204 208 61 62 69 94 66 15 15 15 14 14 14 14 14 13 12 92 67 102 70 77 93 95 65 90 (Other) 12 11 10 10 10 10 10 9 9 213
数据样本
Latency对应数据文件前几行:
elapsed,label,success,Latency 103,request,true,102 120,request,true,117 104,request,true,102 104,request,true,102 127,request,true,122 3,request,true,1 3,request,true,3 111,request,true,102 4,request,true,3
cpuIdle对应数据文件前几行:
timestamp,value 1684166631,96 1684166642,96 1684166652,96 1684166662,96 1684166672,96 1684166682,97 1684166692,97
- 使用R版本:3.5.2 (2018-12-20)
问题原因
summary()函数的输出格式由输入变量类型决定:
- 输入为**数值型(numeric/integer)**时,输出最小值、四分位数、均值、最大值等统计量;
- 输入为**因子(factor)或字符型(character)**时,输出各水平的频数分布。
你的data$Latency被识别为因子/字符型而非数值型,导致输出频数统计。这通常是因为数据文件中Latency列存在非数值内容(如特殊字符、空值),或read.csv读取时自动将其转换为因子。
解决方案
将data$Latency转换为数值型后再计算summary:
修改后的代码
data <- read.csv(args[1]); # 先转字符再转数值,避免因子转数值时的编码问题 latency_num <- as.numeric(as.character(data$Latency)) s <- summary(latency_num); cpuIdle <- read.csv(args[2]); cpuBusy <- sapply(cpuIdle$value, function(x) { 100-x; }); cpuSum <- summary(cpuBusy); print(cpuSum); print(s);
补充优化
- 若转换时出现非数值内容导致的警告,可在计算summary时忽略缺失值:
s <- summary(latency_num, na.rm = TRUE);
- 也可在读取数据时直接指定
Latency列为数值型,提前规避类型问题(若数据中存在非数值会直接报错,适合确认数据全为数值的场景):
data <- read.csv(args[1], colClasses = c(Latency = "numeric"));
内容的提问来源于stack exchange,提问作者Uhno Semen
相关产品推荐
相关产品推荐

