R语言学习笔记——入门篇:第五章-高级数据管理

R语言

R语言学习笔记——入门篇:第五章-高级数据管理



一、数值与字符处理函数

1.1、数学函数

函数功能示例
abs(x)绝对值abs(-4) 返回值为4
sqrt(x)平方根sqrt(16) 返回值为4
ceiling(x)向上取整ceiling(3.456) 返回值为4
floor(x)向下取整floor(3.456) 返回值为3
trunc(x)向0的方向取整trunc(3.456) 返回值为3
round(x,digits = n)确认小数(四舍五入,n默认为0)round(3.456,digits=2) 返回值为3.46
signif(x,digits = n)确认有效数字(四舍五入,默认无变化)signif(3.456,digits = 2) 返回值为3.5
cos(x),sin(x),tan(x)余弦,正弦和正切
aces(x),asin(x),atan(x)反余弦,反正弦和反正切
cosh(x),sinh(x),tanh(x)双曲余弦,双曲正弦和双曲正切
acosh(x),asinh(x),atanh(x)反双曲余弦,反双曲正弦和反双曲正切
log (x,base = n)对数函数,底数为n
log(x)自然对数log(10) 返回值为2.3026
log10(x)常用对数log10(10) 返回值为1
exp(x)指数函数,y=e^x (x∈R)exp(2.3026) 返回值为10

1.2、统计函数

函数功能示例
mean(x)平均数mean(c(1,2,4,7)) 返回值为3.5
median(x)中位数median(c(1,2,4,7)) 返回值为3,median(c(1,2,4,7,3)) 返回值为3
sd(x)标准差(可以直观展现数据的离散度)sd(c(1,2,3)) 返回值为1
var(x)方差(标准差的平方)var(c(1,2,3)) 返回值为1
mad(x)绝对中位差:原数据减去中位数后得到的新数据的绝对值的中位数,常用来估计标准差mad(c(1,2,3)) 返回值为1.4826
quantile(x,probs)求分位数,x为待求分位的数值型向量,probs为一个由[0,1]之间概率组成的数值向量quantile(c(1,2,3),c(.3,.84)) 返回值为 30% 位点1.60 84% 位点2.68
range(x)求值域,diff(range(x))为求极差range(c(1,2,3)) 返回值为1,3
sum(x)求和sum(c(1,2,3)) 返回值为6
diff(x,lag = a)滞后差分,lag用以指定滞后几项,默认为1diff(c(2,4,6,8),lag = 2) 返回值为4,4
min(x)求最小值min(c(1,2,3)) 返回值为1
max(x)求最大值max(c(1,2,3)) 返回值为3
scale(x,center = TRUE,scale = TRUE)为数据对象x按列进行中心化(center=TRUE,改均值)或标准化(center=TRUE,scale = TRUE,改标准差)详见数据的标准化示例
  • 数据的标准化示例
# scale()函数只能对数值型数据进行操作
# 默认情况下,scale()函数对矩阵或数据框的指定列进行均值为0,标准差为1的标准化
x <- c(1,10,6)
x1 <- scale(c(1,10,6))

> mean(x)
[1] 5.666667
> sd(x)
[1] 4.50925

> mean(x1)
[1] -3.237473e-17
# 无穷小,趋于0
> sd(x1)
[1] 1

# 标准化后的数据
> x1
            [,1]
[1,] -1.03490978
[2,]  0.96098765
[3,]  0.07392213
# 原均值
attr(,"scaled:center")
[1] 5.666667
# 原标准差
attr(,"scaled:scale")
[1] 4.50925

# 对每一列数据进行任意均值和标准差的标准化,SD为想要的标准差,M为想要的均值
x2 <- scale(x)*SD+M
# 对指定列(myvar)进行标准化,transform(DataFrame, value)函数用于修改DataFrame数据
x3 <- transform(mydata,myvar = scale(myvar)*SD+M)

1.3、概率函数

  • 概率函数也属于统计函数一类,由于其特殊性,这边单独开一节来记录
  • R中概率函数形如[dpqr]distribution_abbreviation()
    • d = 密度函数(density)
    • p = 分布函数(distribution function)
    • q = 分位数函数(quantile function)
    • r = 生成随机数(随机偏差)
  • distribution_abbreviation(),常见的概率函数
函数功能
betaBeta分布
binom二项分布
cauchy柯西分布
chisq(非中心)卡方分布
exp指数分布
fF分布
gammaGamma分布
geom几何分布
hyper超几何分布
lnorm对数正态分布
logisLogistic分布
multinom多项分布
nbinom负二项分布
norm正态分布
pois泊松分布
signrankWilcoxon符号秩分布
tt分布
unif均匀分布
weibullWeibull分布
wilcoxWilcoxon秩和分布
  • 示例
# 在区间[-3,3]上绘制标准正态曲线 
x <- pretty(c(-3,3),30)
y <- dnorm(x)
plot(x,y,type="o",xlab = "Normal Density",ylab = "Density",yaxs="i")
# 位于x=3处左侧的标准正态分布曲线下方的面积(标准正态分布曲线与x轴形成的面积为1)
pnorm(3)
[1] 0.9986501
# 均值为10,标准差为10的正态分布0.8分位点的值 
qnorm(.8,mean = 10,sd = 50)
[1] 52.08106
# 生成50个均值为10,标准差为10的正态分布随机数
rnorm(50,mean = 10,sd = 50)
 [1]   28.981974  -15.116173   -6.660369  -40.928769  -43.589561   25.176432   32.410489
 [8]   12.650211   56.113373  112.504234  -14.551558 -105.458444   60.286926  -25.460038
[15]  -24.400431   61.278568   -4.238650  -51.035886   19.065174    3.055432   10.288209
[22]   29.264020   -8.533002   42.218827   -1.024328   26.589098   64.841951   31.759075
[29]   -6.296579   67.440381   59.675193   37.419848   21.936587  -21.395304   78.032622
[36]  -20.012979  119.366650   86.630531   -1.785018  -41.321045  -25.520328   22.844185
[43]   -2.334594   -7.377130  -37.580928    7.748614  -29.245223  -73.397097   -9.011326
[50]   55.949830

在这里插入图片描述

  • 在R中存在着生成伪随机数的函数,例如:
    • runif(n) 函数:生成n个0到1区间上服从均匀分布(unif)的伪随机数
    • MASS包中的 mvrnorm(n,mean,signma) 函数生成n个,均值为mean,方差-协方差矩阵为signma的多元正态分布的数据
  • 重现伪随机数:每次调用上述函数生成的数据都不同,通过设定随机数种子,可以重现伪随机数。
    • set.seed(n) 函数,n为数值。
    • 示例
> runif(3)
[1] 0.2825283 0.9611048 0.7283944
> set.seed(1)
> runif(3)
[1] 0.2655087 0.3721239 0.5728534
> set.seed(1)
> runif(3)
[1] 0.2655087 0.3721239 0.5728534

1.4、字符处理函数

前面介绍的函数都是对数值型变量进行操作的,下面介绍字符处理函数。

函数功能示例
nchar(x)计算x中的字符数x <- c(“a”,“bc”,“defgh”) length(x)返回值为3 nchar(x[3])返回值为5
substr(x,start,stop)提取或替换一个字符向量中的子串x <- “abcdef” substr(x,2,4) 返回值为"bcd" substr(x,2,4) <- “11111"返回值为"a111ef”
grep(pattern,x,ignore.case = F,fixed = F)在x中搜索pattern。若fixed=F则pattern为正则表达式,若fixed=T则pattern为文本字符串。grep(“a”,x <- c(“a”,“bab”,“b”),fixed = T)返回值为1,2
sub(pattern,replacement,x,ignore.case = F,fixed = F)在x中搜索pattern,以replacement替换。若fixed=F则pattern为正则表达式,若fixed=T则pattern为文本字符串。sub(“\s” ,“-”,“Hello World”)返回值为Hello-World .其中\s是查找空白的正则表达式,\是R中的转义字符,为了区分写作\s
strsplit(x,split,fixed = F)在split处分割字符向量x中的元素。若fixed=F则pattern为正则表达式,若fixed=T则pattern为文本字符串。strsplit(“abc”,“”)返回值为 “a” “b” “c"strsplit(“a,bc”,”,")返回值为 “a” “bc”
paste(… ,sep = “”)连接字符串,以sep为连接符paste(“x”,1:3,sep = “”)返回值为"x1" “x2” “x3”
toupper(x)大写转换toupper(“abc”)返回值为"ABC"
tolower(x)小写转换tolower(“ABC”)返回值为"abc"
  • 正则表达式:针对函数grep(),sub(),strsplit()可以搜索正则表达式,其为文本模式的匹配提供了一套匹配的语法
    • 示例
^[hc]?at
# 用以匹配任意以0个或1个和h或c开头,后接at的字符串。
# 因此其可以匹配hat,cat,at,但不会匹配bat等其他字符串。
  • 在多数实际应用中正则表达式,文本字符串的差异性不大。

1.5、其他实用函数

函数功能示例
length(x)求x的长度length(c(“a”,“bc”,“defgh”))返回值为3
seq(from,to,by)生成一个序列,从from至to,间隔byseq(1,10,2)返回值为1 3 5 7 9
rep(x,n)将x重复n次rep(1:2,2)返回值为1 2 1 2
cut(x,n)将连续型变量x切割为有着n个水平的因子
pretty(x,n)创建美观分割点。通过选取n+1个等间距的取整值,将一个连续型变量x分为n个区间。绘图中常用。x <- pretty(c(-3,3),30) y <- dnorm(x) plot(x,y,type=“o”,xlab = “Normal Density”,ylab = “Density”,yaxs=“i”)在区间[-3,3]上绘制标准正态曲线
cat(…,file = “myfile”,append = F)连接…中的对象,将其输出到屏幕或file中cat(“Hello”,“World”,“\b.”,“I”,“am”,“fine”,“\b.”)返回值为Hello World.I am fine.
  • 转义字符
    • \n表示换行,\t表示制表符,\b表示退格,'表示单引号
    • ?Quotes以了解更多
  • cat()函数的示例解释:由于cat输出连接对象时,会以空格作为连接符,为了让两个对象中间没有连接符,所以使用了退格转义字符\b

1.6、将函数应用于矩阵与数据框

  • 函数apply()
  • 功能:将任意函数应用到矩阵,数组,数据框的任何维度上
  • 语法
apply(x,MARGIN,FUN,...)
# x为数据对象,MARGIN为维度的下标(1表示行,2表示列)
# FUN为需要使用的函数,...包括了任何想要传递给FUN的参数
  • 示例
apply(leadership,2,max)
# 计算每一列的最大值
  • 函数sapply()
  • 功能:将任意函数应用到列表的任何维度上
  • 语法
lapply(X, FUN, ...)
# x为数据对象,FUN为需要使用的函数,...包括了任何想要传递给FUN的参数
  • 示例
Student <- c("A a","B b","C c","D d")
name <- strsplit(Student," ")
Lastname <- sapply(name,"[",2)
Firstname <- sapply(name,"[",1)

> Lastname
[1] "a" "b" "c" "d"
> Firstname
[1] "A" "B" "C" "D"
# “[”可以提取某个对象一部分的函数

二、控制流

2.1、循环(for,while)

  • 重复一系列操作,直至条件不为真。

2.1.1、for循环

  • 语法
for(var in seq) statement
# var 变量
# seq 条件范围
# statement 符合条件使执行的操作
  • 示例
 i <- 1
 for(i in 1:10) 
   {i <- i + 1;
 print(i)}

[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11

2.1.2、while循环

  • 语法
while(cond) statement
# cond 条件范围
# statement 符合条件使执行的操作
  • 示例
i <- 1
while(i <= 10)
{
  i <- i+1;
  print(i)
}

[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11

2.2、条件执行(if-else,ifelse,switch)

2.2.1、if-else语句

  • 在条件为真时执行操作语句
  • 语法
if(cond) statement
if(cond) statement1 else statement2
# cond 条件
# statement 符合条件使执行的操作
  • 示例
for(i in 1:10)
{
  if(i > 5) print(i) else print(NA)
}

[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

2.2.2、多重嵌套if-else

  • 语法
if(cond 1) {
   statement1 
} else if(cond 2) {
   statement2
} else if(cond 3) {
   statement3 
} else {
   executes when none of the above condition is true.
}
  • 示例
p<-95
if (p>=90)
  paste("优",p,sep = ":") else if (p<90 & p >=80)
    paste("良",p,sep = ":") else if (p<80 & p>=60)
      paste("及格",p,sep = ":") else if (p<60)
        paste("不及格",p,sep = ":")

[1] "优:95"

2.2.3、ifelse语句

  • if-else的简化版本,只能执行二元行为(两个选项)
  • 语法
ifelse(cond,statement1,statement2)
  • 示例
for(i in 1:10)
{
  ifelse(i > 5,print(i),print(NA))
}

2.2.4、switch语句

  • 类似于其他语言中的case函数,遍历所有条件,直至匹配上后返回该条件下操作的运行结果
  • 语法
switch(expr,...)
  • 示例
require(stats)
centre <- function(x, type) {
  switch(type,
         mean = mean(x),
         median = median(x),
         trimmed = mean(x, trim = .1))
}
x <- rcauchy(10)
centre(x, "mean")
centre(x, "median")
centre(x, "trimmed")

ccc <- c("b","QQ","a","A","bb")
for(ch in ccc)
  cat(ch,":", switch(EXPR = ch, a = 1, A = 1, b = 2:3, "Otherwise: last"),"\n")

b : 2 3 
QQ : Otherwise: last 
a : 1 
A : 1 
bb : Otherwise: last

三、自编函数

  • 当现有R包无法满足你的需求时,R语言支持自己编写函数。
  • 形如
myfunction <- function(arg1,arg2,...)
{
  statements
  return(object)
}
  • 编写好的函数,可以通过将其配置入环境变量中,使R在启动时自动读取该函数。

四、整合与重构

4.1、转置

  • 函数t()
  • 功能:对矩阵,数据框进行转置,对后者行名将变为变量(列)名
    • 语法
t(x)
# x为矩阵或数据框

4.2、整合数据

  • 定义:将多组观测替换为根据这些观测计算的描述性统计量(改数据值)
  • 函数aggregate()
  • 功能:使用一个或多个by变量和预先定义好的函数来折叠数据
  • 语法
aggregate(x,by,FUN)
# x为待折叠数据对象,by为变量名组成的列表(变量必须在列表中,即使只有一个变量),这些变量将被去掉以形成新的观测
# FUN则是用来计算描述性统计量的标量函数,用以计算新观测中的值。
  • 示例
by1 <- c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12)
by2 <- c("wet", "dry", 99, 95, NA, "damp", 95, 99, "red", 99, NA, NA)
testDF <- data.frame(by1,by2,v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),
                     v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99) )

aggregate(x = testDF, by = list(Group.by1=by1, Group.by2=by2), FUN = "mean", na.rm = F)

# 原数据
    by1  by2 v1 v2
1   red  wet  1 11
2  blue  dry  3 33
3     1   99  5 55
4     2   95  7 77
5  <NA> <NA>  8 88
6   big damp  3 33
7     1   95  5 55
8     2   99 NA NA
9   red  red  4 44
10    1   99  5 55
11 <NA> <NA>  7 77
12   12 <NA>  9 99

# 根据by1与by2整理折叠后的数据(折叠了重复项,删除了by1和by2中的NA值的行)
# by = list(Group.by1=by1, Group.by2=by2)将列自定义了名字
# na.rm=F参数、在计算和分析中不删除缺失值获得有效的计算结果
na.rm = F
  Group.by1 Group.by2  by1  by2 v1 v2
1       1      95    1   95  5 55
2       2      95    2   95  7 77
3       1      99    1   99  5 55
4       2      99    2   99 NA NA
5     big    damp  big damp  3 33
6    blue     dry blue  dry  3 33
7     red     red  red  red  4 44
8     red     wet  red  wet  1 11

4.3、reshape2包

  • 概述:reshape2包包含了对数据集的重构与整合,功能十分强大
  • 操作步骤:先将数据融合(melt),以使每一行都是唯一的标识符-变量组合,然后将数据**重铸(cast)**为你想要的形状
  • 安装
install.packages("reshape2")
library(reshape2)
  • 示例:原始数据集
    • 测量(测试变量)指最后两列的值,在知道ID,Time,变量X1/X2后可以确定测量值
IDTimeX1X2
1156
1235
2161
2224

4.3.1、融合

  • 函数melt()
  • 功能:将数据集重构为:每个测试变量独占一行,行中带有要唯一确认这个给测量所需的标识符变量。
  • 语法
melt(data, ..., na.rm = FALSE, value.name = "value")
# data为原始数据集
  • 示例
ID <- c(1,1,2,2)
Time <- c(1,2,1,2)
X1 <- c(5,3,6,2)
X2 <- c(6,5,1,4)

md <- data.frame(ID,Time,X1,X2)
md1 <- melt(md,id = c("ID","Time"))
# 必须要指定要唯一确定每一个测量所需的变量(ID和Time),二表示测量变量名的变量(X1/X2)将由程序自动创建


  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

4.3.1、重铸

  • 函数dcast()
  • 功能:读取已融合的数据,并使用你提供的公式和一个(可选)用于整合数据的函数将其重铸。
  • 语法
dcast(
  data,
  formula,
  fun.aggregate = NULL,
)
# data为已融合的数据
# formula描述想要的最后结果
# fun.aggregate(可选)数据整合函数

# 其中formult的格式形如
# rowvar为标识符
# colvar为存放测量的变量
rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...
  • 示例
> # 不执行整合
> dcast(md1,ID+Time~variable)
  ID Time X1 X2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4
> dcast(md1,ID+variable~Time)
  ID variable 1 2
1  1       X1 5 3
2  1       X2 6 5
3  2       X1 6 2
4  2       X2 1 4
> dcast(md1,variable~ID+Time)
  variable 1_1 1_2 2_1 2_2
1       X1   5   3   6   2
2       X2   6   5   1   4
> 
> # 执行整合
> dcast(md1,ID~variable,mean)
  ID X1  X2
1  1  4 5.5
2  2  4 2.5
> dcast(md1,Time~variable,mean)
  Time  X1  X2
1    1 5.5 3.5
2    2 2.5 4.5
> dcast(md1,ID~Time,mean)
  ID   1 2
1  1 5.5 4
2  2 3.5 3
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值