文章目录
  1. 高级数据管理
    1. 1、数值和字符处理函数
      1. (1)数学函数
      2. (2)统计函数
      3. (3)概率函数
        1. 1)、设定随机数种子
        2. 2)、生成多元正态数据
      4. (4)字符处理函数
      5. (5)其他函数
      6. (6)函数应用到矩阵或数据框
    2. 2、控制流
      1. (1)重复和循环
      2. (2)条件执行
    3. 3、用户自编函数
    4. 4、整合与重构
      1. (1)转置
      2. (2)聚合函数
      3. (3)reshape包
        1. 1)融合
        2. 2)重铸

高级数据管理

1、数值和字符处理函数

(1)数学函数

函数 含义
abs(x) 绝对值
sqrt(x) 平方根和25^(0.5)等价
ceiling(x) 不小于x的最小整数,正无穷方向取整
floor(x) 不大于x的最大整数,负无穷方向取整
trunc(x) 向 0 的方向截取的x中的整数部分
round(x, digits=n) 将x舍入为指定位的小数
signif(x, digits=n) 将x舍入为指定的有效数字位数,
signif(3.475, digits=2) 返回值为3.5
cos(x)、 sin(x) 、 tan(x) 余弦、正弦和正切
acos(x) 、 asin(x) 、 atan(x) 反余弦、反正弦和反正切
cosh(x) 、 sinh(x) 、 tanh(x) 双曲余弦、双曲正弦和双曲正切
acosh(x) 、 asinh(x) 、 atanh(x) 反双曲余弦、反双曲正弦和反双曲正切
log(x,base=n) n为底,x的对数
log(x) e为底,x的对数
log10(x) 10为底,x的对数
exp(x) e指数函数

以上函数如果用于向量、矩阵或者数据框,则对每个元素进行运算。

(2)统计函数

函数 含义
mean(x) 均值
median(x) 中位数
sd(x) 标准差
var(x) 方差
mad(x) 绝对中位差
quantile(x,probs) 分位数,probs一个[0,1]之间的概率数值向量
range(x) 求值域
sum(x) 求和
diff(x, lag=n) 滞后差分,lag为滞后几项,默认为1
min(x) 最小值
max(x) 最大值
scale(x, center=TRUE, scale=TRUE) 为数据对象x按列进行中心化(center=TRUE)或标准化(center=TRUE,scale=TRUE)

(3)概率函数

分布 函数
Beta分布 beta
Logistic分布 logis
二项分布 binom
多项分布 multinom
柯西分布 cauchy
负二项分布 nbinom
(非中心)卡方分布 chisq
正态分布 norm
指数分布 exp
泊松分布 pois
F分布 f
Wilcoxon符号秩分布 signrank
Gamma分布 gamma
t分布 t
几何分布 geom
均匀分布 unif
超几何分布 hyper
Weibull分布 weibull
对数正态分布 lnorm
Wilcoxon秩和分布 wilcox

1)、设定随机数种子

set.seed(),这样可以重现结果

2)、生成多元正态数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
library(MASS)
options(digits=3)
set.seed(1234)
mean=c(230.4,123.2,3.7)
sigma=matrix(c(15360.8,6721.2,-47.1,6721.2,4700.9,-16.5,-47.1,-16.5,0.3),nrow=3,ncol=3)
#多元正态数据
mydata=mvrnorm(50000,mean,sigma)
mydata=as.data.frame(mydata)
names(mydata)=c("x","y","z")
#三维散点图
library(scatterplot3d)
scatterplot3d(mydata$x, mydata$y, mydata$z, highlight.3d=TRUE,col.axis="blue", col.grid="lightblue", main="scatterplot3d - 2", pch=20)

(4)字符处理函数

函数 含义
nchar(x) 返回字符数量
substr(x,start,stop) 提取货替换一个字符中的字串,substr(x,2,4)<-“xxx”
grep(pattern, x, ignore. case=FALSE,fixed=FALSE) 在x中搜索某种模式,fixed=FALSE则表示为一个正则表达式,若fixed=TRUE则为文本,返回下标
sub(pattern, replacement,x, ignore. case=FALSE,fixed=FALSE) 在x中搜索某种模式,并替换为replacement,fixed=FALSE则表示为一个正则表达式,若fixed=TRUE则为文本
strsplit(x, split, fixed=FALSE) 拆分字符串,fix同上
paste(…, sep=””) 连接字符串,分隔符为sep
toupper(x) to大写
tolower(x) to小写

(5)其他函数

函数 含义
length(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 =”myfile”,append =FALSE) 连接…中的对象,并将其输出到屏幕上或文件中(如果声明了一个的话)

(6)函数应用到矩阵或数据框

1
2
3
4
5
apply(x,MARGIN,FUN,…)
#x:数据对象
#MARGIN:1表示行,2表示列
#FUN:表示函数
#…:表示参数

一个数据处理问题:按照姓名排序并且对成绩评级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#初始化数据
options(digits = 2)
Student=c("J D","A W","B M","D J","J M","C C","R Y","G K","J E","M R")
Math=c(502,600,412,358,495,512,410,625,573,522)
Science=c(95,99,80,82,75,85,80,95,89,86)
English=c(25,22,18,15,20,28,15,30,27,18)
roster=data.frame(Student,Math,Science,English,stringsAsFactors = FALSE)
#归一化成绩
z<-scale(roster[,2:4])
#平均成绩
score<-apply(z,1,mean)
#平均成绩加入数据框
roster=cbind(roster,score)
#取成绩分位数
y=quantile(score,c(.8,.6,.4,.2))
#新增级别变量并赋值
roster$grade[score>=y[1]]<-"A"
roster$grade[score>=y[2] & score<y[1]]<-"B"
roster$grade[score>=y[3] & score<y[2]]<-"C"
roster$grade[score>=y[4] & score<y[3]]<-"D"
roster$grade[score<y[4]]<-"F"
#拆分姓名列为两列
name=strsplit(roster$Student," ")
lastname=sapply(name, "[",2)
firstname=sapply(name, "[",1)
#重新加入姓名两列至数据框
roster<-cbind(firstname,lastname,roster[,-1])
#按照姓名两列排序
roster=roster[order(lastname,firstname),]

2、控制流

(1)重复和循环

  • 低效费时,尽量使用内建函数与apply函数

1)

1
2
3
4
5
#for:
for (var in seq) statement
#eg.
for (i in 1:10) print("Hello world")

2)

1
2
3
4
5
6
7
8
9
#while:
while(cond) statement
#eg.
i=0;
while(i<10)
{
print("x");i=i+1
}

(2)条件执行

1)

1
2
#if-else结构
if(!is.character(date)) {date2<-as.factor(date)} else {print("Done")}

2)

1
2
3
4
5
6
7
8
9
#switch结构
feeling<-c("sad","afraid")
for(i in feeling)
print(
switch(i,
happy="Happy",
sad="Sad",
afraid="afraid")
)

3、用户自编函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#函数:
mystats<-function(x,parametric=TRUE,print=FALSE){
if(parametric){
center<-mean(x);spread<-sd(x)
centerStr<- paste("Mean=",center,"\n","SD=",spread,"\n")
}else{
center<-median(x);spread<-mad(x)
centerStr<- paste("Median=",center,"\n","MAD=",spread,"\n")
}
if(print){
cat(centerStr)
}
return (list(center=center,spread=spread))
}
#使用:
set.seed(1234)
x<-rnorm(500)
y=mystats(x,parametric = TRUE,print = FALSE)
#函数:
mydate<-function(type="long"){
switch(type,
long=format(Sys.time(),"%A %B %d %Y"),
short=format(Sys.time(),"%m-%d-%y"),
cat(type,"is not a recognized type\n")
)
}
#使用:
mydate("short")

4、整合与重构

(1)转置

1
2
cars<-mtcars[1:5,1:4]
t(cars)

(2)聚合函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#整合
options(digits = 3)
attach(mtcars)
aggdata=aggregate(mtcars, by =list(气缸=cyl,档位=gear),FUN=mean,na.rm=TRUE)
aggdata
#将所有数据按照气缸与档位进行分组,求均值
气缸 档位 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

(3)reshape包

1)融合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#测试数据
id=c(1,1,2,2)
time=c(1,2,1,2)
x1=c(5,3,6,2)
x2=c(6,5,1,4)
textData=data.frame(id,time,x1,x2,stringsAsFactors = FALSE)
library(reshape)
md<-melt(textData, id=(c("id","time")))
id time x1 x2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
#转换为
id time variable value
1 1 1 x1 5
2 1 2 x1 3
3 2 1 x1 6
4 2 2 x1 2
5 1 1 x2 6
6 1 2 x2 5
7 2 1 x2 1
8 2 2 x2 4

2)重铸

cast(md, formula,FUN) #md为已经融合的数据

formula: rowvar1 + rowvar2 +…~ colvar1 + colvar2 +…

在这一公式中, rowvar1 + rowvar2 + …定义了要划掉的变量集合,以确定各行的内容,

而colvar1 + colvar2 + …则定义了要划掉的、确定各列内容的变量集合。

参见图中的示例。

文章目录
  1. 高级数据管理
    1. 1、数值和字符处理函数
      1. (1)数学函数
      2. (2)统计函数
      3. (3)概率函数
        1. 1)、设定随机数种子
        2. 2)、生成多元正态数据
      4. (4)字符处理函数
      5. (5)其他函数
      6. (6)函数应用到矩阵或数据框
    2. 2、控制流
      1. (1)重复和循环
      2. (2)条件执行
    3. 3、用户自编函数
    4. 4、整合与重构
      1. (1)转置
      2. (2)聚合函数
      3. (3)reshape包
        1. 1)融合
        2. 2)重铸