(三)高级数据管理

在基本数据管理中主要学习了数据框(data.frame)的基本操作,主要包括:简单数据文件读入、创建/删除变量(列)、行列的重命名、变量重编码、NA值简单处理、数据选取等。
本节主要介绍一些数学统计函数和字符处理函数、数据整合与重塑等。

1、数学统计函数和字符处理函数

R中常用的数学函数如下,这些函数都具有广播性:

函数 描述
abs(x) 取绝对值
sqrt(x) 取平方根
ceiling(x) 不小于x的最小整数,如ceiling(3.5)返回4
floor(x) 不大于x的最大整数,floor(3.5)返回3
trunc(x) 取整数部分,如trunc(3.5)返回3
round(x, digits=n) 四入五入到指定位数,如round(3.458, digits=2)返回值为3.46
signif(x, digits=n) 四舍五入到指定有效数字位数,如signif(3.458, digits=2)返回值3.5
cos(x)、sin(x)、tan(x)、acos(x)、asin(x)、atan(x)、cosh(x)、sinh(x)、acosh(h)等 三角函数
log(x, base=n) 以n为底对x取对数,其中log(x)为自然对数,log10(x)为常用对数
exp(x) 以e为底的指数函数

常用统计函数如下所示,其中大部分函数都拥有重要参数,如mean(x,trim=0.05,na.rm=TRUE)表示去除首尾5%极值和所有缺失值后的算术平均数。使用?func可查看相应函数用法。

函数 描述
mean(x) 求平均数
median(x) 中位数
sd(x) 标准差
var(x) 方差
mad(x) 绝对中位差(median absolute deviation)
quantile(x, probs) 求分位数。其中x为代求分位数的数值型向量,probs为[0,1]间的概率值组成的数值向量,如quantile(x, c(0.3,0.8))
range(x) 求值域
sum(x) 求和
diff(x, lag=n) 滞后差分,lag指定滞后几项,默认为1
min(x) 最小值
max(x) 最大值
scale(x, center=TRUE, scale=TRUE) 为数据对象按列进行中心化(center=TRUE)或标准化(center=TRUE, scale=TRUE)

默认情况下 ,函数scale()对矩阵或数据框的指定列进行均值为0,标准差为1的标准化。下面的例子简单展示了scale的用法。

> student <- c('andy','lucy','mike','jacky');score <- c(88,92,67,75);df<-data.frame(student,score);df
  student score
1    andy    88
2    lucy    92
3    mike    67
4   jacky    75
> scale(df$score)
           [,1]
[1,]  0.6487087
[2,]  0.9946866
[3,] -1.1676756
[4,] -0.4757197
attr(,"scaled:center")
[1] 80.5
attr(,"scaled:scale")
[1] 11.56143
# 要进行任意均值和标准差的标准化,可用 scale(x)*SD + M, 其中SD表示标准差,M表示均值
> df <- transform(df, scale_score=scale(score)*10+50);df
  student score scale_score
1    andy    88    56.48709
2    lucy    92    59.94687
3    mike    67    38.32324
4   jacky    75    45.24280

概率分布函数暂时还不太懂。下面是字符处理函数

函数 描述
nchar(x) 计算x中的字符数量
substr(x, start, stop) 提取或替换一个字符向量的子串
grep(pattern, x, ignore.case=FALSE, fixed=FALSE) 在x中搜索某种模式。fixed=FALSE时表示pattern使用正则表达式,否则pattern仅表示字符串。返回值为匹配的下标
sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE) 在x中搜索pattern,并以replacement将其替换。fixed用法与grep相同
strsplit(x, split, fixed=FALSE) 以split为分隔符分割x,返回一个列表
paste(...,sep="") 以sep为连接符连接字符串
toupper(x) 转换为大写
tolower(x) 转换为小写

其他一些常用函数

函数 描述
length(x) x长度
seq(from, to, by) 生成一个序列
rep(x, n) 生成一个x重复n次的向量
cut(x, n) 将连续型变量x分割为有着n个水平的因子,使用ordered_result=TRUE以创建一个有序型因子
pretty(x ,n) 创建美观的分割点。通过选取n+1个等间距的取整值,将一个连续型变量x分割为n个区间。绘图常用
cat(..., file="filename", append=FALSE) 连接...中的对象,并将其输出到屏幕上或文件中(如果声明了的话)

2、一个数据处理的例子

现有一些学生成绩,需要对其做出整理做出一个综合排序。例子来自R语言实战。

##### 生成数据
> math <- c(500,600,450,465,550,530,487,568,350,400)
> science <- c(90,98,95,86,84,99,75,80,76,74)
> english <- c(25,20,18,12,23,15,22,13,30,17)
> student<-c('john davis', 'angela willam', 'bull moose', 'david jones', 'janice mark', 'chery cushing', 'riven yark', 'greg knox', 'joel england', 'olaf halen')
> df <- data.frame(student, math, science, english, stringsAsFactors=FALSE);df
         student math science english
1     john davis  500      90      25
2  angela willam  600      98      20
3     bull moose  450      95      18
4    david jones  465      86      12
5    janice mark  550      84      23
6  chery cushing  530      99      15
7     riven yark  487      75      22
8      greg knox  568      80      13
9   joel england  350      76      30
10    olaf halen  400      74      17
######由于各科成绩的总分不同,将其标准化便于比较
> z <- scale(df[c(2:4)])
######取标准化后各科成绩的平均值作为每个学生的综合成绩
> options(digits=2);df$score <- apply(z, 1, mean);df
         student math science english  score
1     john davis  500      90      25  0.519
2  angela willam  600      98      20  0.937
3     bull moose  450      95      18  0.064
4    david jones  465      86      12 -0.541
5    janice mark  550      84      23  0.407
6  chery cushing  530      99      15  0.373
7     riven yark  487      75      22 -0.240
8      greg knox  568      80      13 -0.246
9   joel england  350      76      30 -0.325
10    olaf halen  400      74      17 -0.947
#####新增变量grade使用ABCDF来表示成绩,即重编码
> df$grade[df$score>=y[4]] <- 'A';df$grade[df$score=y[3]]<-'B';df$grade[df$score>=y[2] & df$score=y[1]]<-'D';df$grade[df$score name <- strsplit(df$student, " ")
> name
[[1]]
[1] "john"  "davis"

[[2]]
[1] "angela" "willam"

[[3]]
[1] "bull"  "moose"

[[4]]
[1] "david" "jones"

[[5]]
[1] "janice" "mark"  

[[6]]
[1] "chery"   "cushing"

[[7]]
[1] "riven" "yark" 

[[8]]
[1] "greg" "knox"

[[9]]
[1] "joel"    "england"

[[10]]
[1] "olaf"  "halen"
#####将姓和名分别赋值给一个向量,然后将这两个向量合并到数据框中
> lastname<-sapply(name, '[', 2); firstname<-sapply(name,'[',1);df<- cbind(firstname,lastname,df[,-1]);df
   firstname lastname math science english  score grade
1       john    davis  500      90      25  0.519     A
2     angela   willam  600      98      20  0.937     A
3       bull    moose  450      95      18  0.064     C
4      david    jones  465      86      12 -0.541     F
5     janice     mark  550      84      23  0.407     B
6      chery  cushing  530      99      15  0.373     B
7      riven     yark  487      75      22 -0.240     C
8       greg     knox  568      80      13 -0.246     D
9       joel  england  350      76      30 -0.325     D
10      olaf    halen  400      74      17 -0.947     F
#####使用firstname和lastname这两项进行排序
> df<-df[order(firstname,lastname),];df
   firstname lastname math science english  score grade
2     angela   willam  600      98      20  0.937     A
3       bull    moose  450      95      18  0.064     C
6      chery  cushing  530      99      15  0.373     B
4      david    jones  465      86      12 -0.541     F
8       greg     knox  568      80      13 -0.246     D
5     janice     mark  550      84      23  0.407     B
9       joel  england  350      76      30 -0.325     D
1       john    davis  500      90      25  0.519     A
10      olaf    halen  400      74      17 -0.947     F
7      riven     yark  487      75      22 -0.240     C
3、数据整合与重构

使用函数t()可以对数据框或者矩阵进行转置。

> cars <- mtcars[1:5,1:4];cars
                  mpg cyl disp  hp
Mazda RX4          21   6  160 110
Mazda RX4 Wag      21   6  160 110
Datsun 710         23   4  108  93
Hornet 4 Drive     21   6  258 110
Hornet Sportabout  19   8  360 175
> t(cars)
     Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout
mpg         21            21         23             21                19
cyl          6             6          4              6                 8
disp       160           160        108            258               360
hp         110           110         93            110               175

使用R内置函数aggregate(x ,by, FUN)可以对数据进行折叠(collapse,相当于分组,python pandas中groupby,FUN相当于groupby后进行的处理函数)。by是一个变量名组成的列表(必须是列表),还可以为分组变量声明自定义的名称。FUN表示对每一个分组内的数据进行的处理方式。

> options(digits=3)
> attach(mtcars)
> aggdata <- aggregate(mtcars, by=list(cyl,gear),FUN=mean,na.rm=TRUE); aggdata
  Group.1 Group.2  mpg cyl disp  hp drat   wt qsec  vs   am gear carb
1       4       3 21.5   4  120  97 3.70 2.46 20.0 1.0 0.00    3 1.00
2       6       3 19.8   6  242 108 2.92 3.34 19.8 1.0 0.00    3 1.00
3       8       3 15.1   8  358 194 3.12 4.10 17.1 0.0 0.00    3 3.08
4       4       4 26.9   4  103  76 4.11 2.38 19.6 1.0 0.75    4 1.50
5       6       4 19.8   6  164 116 3.91 3.09 17.7 0.5 0.50    4 4.00
6       4       5 28.2   4  108 102 4.10 1.83 16.8 0.5 1.00    5 2.00
7       6       5 19.7   6  145 175 3.62 2.77 15.5 0.0 1.00    5 6.00
8       8       5 15.4   8  326 300 3.88 3.37 14.6 0.0 1.00    5 6.00
> aggdata <- aggregate(mtcars, by=list(Group.cyl=cyl,Group.gear=gear),FUN=mean,na.rm=TRUE); aggdata
  Group.cyl Group.gear  mpg cyl disp  hp drat   wt qsec  vs   am gear carb
1         4          3 21.5   4  120  97 3.70 2.46 20.0 1.0 0.00    3 1.00
2         6          3 19.8   6  242 108 2.92 3.34 19.8 1.0 0.00    3 1.00
3         8          3 15.1   8  358 194 3.12 4.10 17.1 0.0 0.00    3 3.08
4         4          4 26.9   4  103  76 4.11 2.38 19.6 1.0 0.75    4 1.50
5         6          4 19.8   6  164 116 3.91 3.09 17.7 0.5 0.50    4 4.00
6         4          5 28.2   4  108 102 4.10 1.83 16.8 0.5 1.00    5 2.00
7         6          5 19.7   6  145 175 3.62 2.77 15.5 0.0 1.00    5 6.00
8         8          5 15.4   8  326 300 3.88 3.37 14.6 0.0 1.00    5 6.00
#####在这里mean表示对每一个组内的数据去平均值,如分组(cyl=4, gear=3)所对应的所有的mpg的均值为21.5

aggregate可以对数据进行简单的整合,但要进行更复杂的重构,可以使用reshape2包,但reshape2较难以理解。

参考:
R语言实战.

你可能感兴趣的:((三)高级数据管理)