碎碎念
没有碎碎念。
已有的基本函数
1、数学函数:
对数据进行一些数值上的操作。当这些函数运用于数值向量、矩阵或者数据框上时,会作为独立的值进行计算。
2、统计函数:
除了必要的要处理的数据,还有一些可以选择的参数。例如:
x <- c(1,4,6,3,9,3,2,6,7,NA,5,3,1,2,8)
mean(x)
<返回值> NA
mean(x,na.rm=TRUE)
<返回值> 4.285714
标准化
标准化的意义是消除变量的量纲和范围差异对变量之间分析的影响。R中的scale()指的是标准差标准化法,将数据映射成为均值为0,标准差为1的数据。
x <- rexp(20,10) * 10 # 生成20个指数分布的随机数
mean(x)
<返回值> 0.9437997
sd(x)
<返回值> 0.8587231
y <- scale(x)
mean(y)
<返回值> 1.076613e-17
sd(y)
<返回值> 1
y <- scale(x) * 3 + 10
mean(y)
<返回值> 10
sd(y)
<返回值> 3
# 指定部分列而不是整个矩阵或数据框进行标准化
newdata <- transform(mydata, myvar=scale(myvar)*10+50)
3、概率函数:
通常用于生成特征已知的模拟数据,或者计算概率值。
概率函数形为[dpqr]分布名称,d=密度函数,p=分布函数,q=分位数函数,n=生成随机数。例如:rnorm生成满足正态分布的随机数,dnorm从正态分布中抽样分布密度数据。生成多元函数需要调用MASS包中的mvrnorm函数,参数为生成数目,mean=均值,sigma=协方差矩阵。
# 生成可以重现的随机数
set.seed(1234)
runif(5)
<返回值> 0.1137034 0.6222994 0.6092747 0.6233794 0.8609154
4、矩阵运算:AB为矩阵,xb为向量,k为标量。还有一些包可以用:Matrix、matrixStats等。
5、字符处理:
6、其他实用函数
x <- matrix(round(rnorm(20) * 5 + 10), nrow=4)
x
<返回值>
[,1] [,2] [,3] [,4] [,5]
[1,] 13 6 10 5 8
[2,] 7 8 15 6 8
[3,] 7 5 9 22 12
[4,] 7 6 7 11 7
mean(x)
<返回值> 8.95
apply(x, 1, mean)
<返回值> 8.4 8.8 11.0 7.6
apply(x, 2, mean)
<返回值> 8.50 6.25 10.25 11.00 8.75
apply(data, dim, fun) # 数据(矩阵、数据框),应用的维度,使用的函数
sapply(X, FUN, # X数据(矩阵、数据框、列表)
simplify = TRUE, # 指定输入的数据类型
USE.NAMES = TRUE)
控制流
1、循环
for (var in seq) {statement1; statement2} # var不在seq范围内则停止执行
while (cond) {statement} # 直到不满足cond时,停止执行
2、判断
if (cond) {statement}
if (cond1) {statement} else if (cond2) {statement}
ifelse(cond, statement1, statement2) # cond成立,执行statement1;cond为FALSE,执行statement2
3、分支
switch函数根据第一个参数选择执行的语句,且顺序扫描,例如,expr满足情况1,则执行statement1,并跳出语句,不再执行switch后面的语句;expr不满足任何情况,则扫描到最后,执行statement3。
switch(expr, 情况1=statement1, 情况2=statement2, statement3)
# 示例一
for (i in c("sad", "happy")) {
print(
switch(i,
happy = "I am glad you are happy",
afraid = "There is nothing to fear",
sad = "Cheer up",
angry = "Calm down now"
)
)
}
<返回值>
[1] "Cheer up"
[1] "I am glad you are happy"
# 示例二
switch("bad",
happy = "I am glad you are happy",
afraid = "There is nothing to fear",
sad = "Cheer up",
angry = "Calm down now",
"Sorry I don't understand")
<返回值> "Sorry I don't understand"
用户自定义函数
# 定义
myfun <- function(arg1, arg2=TRUE, agr3=7){
statements1;
statements2;
return(object) # 有这一条指令则最后函数会返回一个值
}
# 调用
y <- myfun(x, arg2=FALSE)
示例一:
定义一个函数用来计算数据对象的集中趋势和散布情况。该函数可以选择性给出参数统计值(均值和标准差)和非参数统计值(中位数和绝对中位差),结果以列表的形式存放。另外,用户还可以选择是否将相关值打印出来。
mystats <- function(x, parametric=TRUE, print=TRUE){ # 定义函数名与参数
if (parametric){
center <- mean(x);
spread <- sd(x)
} else {
center <- median(x);
spread <- mad(x)
}
# 以下决定是否打印
if (print & parametric) {
cat("Mean=", center, "\n", "SD=", spread, "\n")
} else if (print & ! parametric) {
cat("Median=", center, "\n", "MAD=", spread, "\n")
}
result <- list(center=center, spread=spread)
return(result)
}
调用:
set.seed(1234)
x <- rnorm(200)
y <- mystats(x)
<返回值>
Mean= -0.05775928
SD= 1.020666
str(y)
<返回值>
List of 2
$ center: num -0.0578
$ spread: num 1.02
y <- mystats(x, parametric=FALSE, print=FALSE)
str(y)
<返回值>
List of 2
$ center: num -0.172
$ spread: num 0.987
示例二:
使用switch让用户选择输出当前日期的格式。
mydate <- function(type="long") { # 默认为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") # 输入不在switch的选择里则执行该条语句
)
}
调用:
mydate()
<返回值> "星期四 十一月 17 2022"
mydate("short")
<返回值> "11-17-22"
mydate("test")
<返回值> test is not a recognized type
其他
这里记录了一些没有学习过但是出现了的函数。
1、cat,相当于print,用于将字符串输出到屏幕上。
2、format,格式标准化,返回的是字符串。