以MASS包中的数据集birthwt为示例。
使用dplyr包中的select,汇总数据框中的数值型变量。为防止重名导致的混淆,包名::函数名特指调用指定包内的函数。
> data(birthwt,package = "MASS") > cont.vars<-dplyr::select(birthwt,age,lwt,bwt)使用sapply(数据框名,统计函数名),计算该数据框内所有变量的指定描述统计结果。
> sapply(cont.vars,mean) age lwt bwt 23.2381 129.8148 2944.5873 > sapply(cont.vars,sd) age lwt bwt 5.298678 30.579380 729.214295 > sapply(cont.vars,min) age lwt bwt 14 80 709 > sapply(cont.vars,max) age lwt bwt 45 250 4990注意变量必须全为数值型 (预先使用select()挑选的原因)否则会报错:
> sapply(birthwt,mean) low age lwt race NA 23.2380952 129.8148148 NA smoke ptl ht ui NA 0.1957672 NA NA ftv bwt 0.7936508 2944.5873016 Warning messages: 1: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA 2: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA 3: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA 4: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA 5: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA > sapply(birthwt,sd) Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) : Calling var(x) on a factor x is defunct. Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.psych包下describe()可以汇总的形式计算数据框内所有变量的常见描述统计量,忽略缺失值。注意所有分类变量都会被当作数值变量处理。
> library(psych) > describe(birthwt) vars n mean sd median trimmed mad low* 1 189 1.31 0.46 1 1.27 0.00 age 2 189 23.24 5.30 23 22.90 5.93 lwt 3 189 129.81 30.58 121 126.07 20.76 race* 4 189 1.85 0.92 1 1.81 0.00 smoke* 5 189 1.39 0.49 1 1.37 0.00 ptl 6 189 0.20 0.49 0 0.08 0.00 ht* 7 189 1.06 0.24 1 1.00 0.00 ui* 8 189 1.15 0.36 1 1.07 0.00 ftv 9 189 0.79 1.06 0 0.62 0.00 bwt 10 189 2944.59 729.21 2977 2961.76 834.70 min max range skew kurtosis se low* 1 2 1 0.80 -1.36 0.03 age 14 45 31 0.71 0.53 0.39 lwt 80 250 170 1.38 2.25 2.22 race* 1 3 2 0.31 -1.75 0.07 smoke* 1 2 1 0.44 -1.82 0.04 ptl 0 3 3 2.76 8.17 0.04 ht* 1 2 1 3.55 10.67 0.02 ui* 1 2 1 1.97 1.87 0.03 ftv 0 6 6 1.56 3.00 0.08 bwt 709 4990 4281 -0.21 -0.14 53.04基本语法:aggregate(数据框名,by=list(变量名=数据框名$变量名),统计函数名)。若其中存在分类变量,会报错。
> aggregate(cont.vars,by=list(smoke=birthwt$smoke),mean) smoke age lwt bwt 1 no 23.42609 130.8957 3055.696 2 yes 22.94595 128.1351 2771.919list()中可并列多个分类变量以实现交叉分组下的统计。
> aggregate(cont.vars,by=list(smoke=birthwt$smoke,race=birthwt$race),mean) smoke race age lwt bwt 1 no white 26.02273 138.8409 3428.750 2 yes white 22.82692 126.3077 2826.846 3 no black 19.93750 149.4375 2854.500 4 yes black 24.10000 142.6000 2504.000 5 no other 22.36364 119.1455 2815.782 6 yes other 22.50000 124.0000 2757.167基本语法:summ(变量名,by=数据框名$分类变量名)
> summ(birthwt$bwt,by=birthwt$smoke) For birthwt$smoke = no obs. mean median s.d. min. max. 115 3055.696 3100 752.657 1021 4990 For birthwt$smoke = yes obs. mean median s.d. min. max. 74 2771.919 2775.5 659.635 709 4238除了输出基本统计量之外,同时还会输出一张图,用于探索数据的趋势、离群值很方便:
基本语法:describeBy(数据框名,数据框名$分类变量名)
> describeBy(birthwt,birthwt$smoke) Descriptive statistics by group group: no vars n mean sd median trimmed mad low* 1 115 1.25 0.44 1 1.19 0.00 age 2 115 23.43 5.47 23 23.09 4.45 lwt 3 115 130.90 28.43 124 127.62 20.76 race* 4 115 2.10 0.93 2 2.12 1.48 smoke* 5 115 1.00 0.00 1 1.00 0.00 ptl 6 115 0.12 0.38 0 0.01 0.00 ht* 7 115 1.06 0.24 1 1.00 0.00 ui* 8 115 1.13 0.34 1 1.04 0.00 ftv 9 115 0.82 0.98 1 0.68 1.48 bwt 10 115 3055.70 752.66 3100 3086.14 816.91 min max range skew kurtosis se low* 1 2 1 1.13 -0.74 0.04 age 14 45 31 0.77 1.00 0.51 lwt 85 241 156 1.30 2.00 2.65 race* 1 3 2 -0.19 -1.82 0.09 smoke* 1 1 0 NaN NaN 0.00 ptl 0 2 2 3.19 10.13 0.04 ht* 1 2 1 3.63 11.24 0.02 ui* 1 2 1 2.17 2.72 0.03 ftv 0 4 4 1.20 1.15 0.09 bwt 1021 4990 3969 -0.28 -0.32 70.19 --------------------------------------- group: yes vars n mean sd median trimmed mad low* 1 74 1.41 0.49 1.0 1.38 0.00 age 2 74 22.95 5.05 22.0 22.60 5.93 lwt 3 74 128.14 33.79 120.0 123.58 22.24 race* 4 74 1.46 0.76 1.0 1.33 0.00 smoke* 5 74 2.00 0.00 2.0 2.00 0.00 ptl 6 74 0.31 0.62 0.0 0.18 0.00 ht* 7 74 1.07 0.25 1.0 1.00 0.00 ui* 8 74 1.18 0.38 1.0 1.10 0.00 ftv 9 74 0.76 1.18 0.0 0.53 0.00 bwt 10 74 2771.92 659.63 2775.5 2782.55 630.10 min max range skew kurtosis se low* 1 2 1 0.38 -1.88 0.06 age 14 35 21 0.55 -0.73 0.59 lwt 80 250 170 1.45 2.22 3.93 race* 1 3 2 1.23 -0.16 0.09 smoke* 2 2 0 NaN NaN 0.00 ptl 0 3 3 2.11 4.46 0.07 ht* 1 2 1 3.38 9.53 0.03 ui* 1 2 1 1.67 0.80 0.04 ftv 0 6 6 1.85 4.03 0.14 bwt 709 4238 3529 -0.28 0.23 76.68类似于describe(),该函数会把所有分类变量都会被当作数值变量处理。