R语言实战---05--函数

高级数据管理

简单的数据管理只是有效的管理数据,二高级数据管理则是更近一步,只有充分了解r语言的控制流程,算术函数等,才可以更高效的处理数据。
为了方便,以下所有的分析,我都会基于r提供的原始数据进行分析。

本节目的
  1. 学习用于创建和转换变量的算术函数、字符处理函数和统计函数。
  2. 探索控制程序流程的方式之后,了解如何编写自己的函数。
  3. 如何使用这些函数来整合及概括数据。
一. 数值和字符处理函数
> abs(x) #绝对值 
abs(-4)	#返回值为 4 
sqrt(x) #平方根, sqrt(25)返回值为 5,和 25^(0.5)等价 
ceiling(x) 	#不小于 x 的最小整数 ,ceiling(3.475)返回值为 4 
floor(x) 	#不大于 x 的最大整数 ,floor(3.475)返回值为 3 这里是引用
trunc(x) #向 0的方向截取的 x 中的整数部分 
trunc(5.99)#返回值为 5 
round(x, digits=n) #将 x 舍入为指定位的小数,round(3.475, digits=2)返回值为 3.48 
signif(x, digits=n) #将 x 舍入为指定的有效数字位数 ,signif(3.475, digits=2)返回值为 3.5 
cos(x)、sin(x)、tan(x)  #余弦、正弦和正切 
cos(2)#返回值为–0.416 
acos(x)、asin(x)、atan(x)  #反余弦、反正弦和反正切 
acos(-0.416)#返回值为 2 
cosh(x)、sinh(x)、tanh(x)  #双曲余弦、双曲正弦和双曲正切 
sinh(2)#返回值为 3.627 
acosh(x)、asinh(x)、atanh(x)  #反双曲余弦、反双曲正弦和反双曲正切 
asinh(3.627)#返回值为 2 
log(x,base=n) #对 x 取以 n 为底的对数 
#为了方便起见: 
• log(x)为自然对数  (以e为底)
• log10(x)为常用对数 
• log(10)返回值为 2.3026 
• log10(10)返回值为 1 
exp(x)  指数函数 (以e为底)
exp(2.3026)返回值为 10 

统计函数

mean(x)  #平均数 
mean(c(1,2,3,4)) # 返回值为 2.5 
median(x) #中位数 
median(c(1,2,3,4)) #返回值为 2.5 
sd(x) #标准差 
sd(c(1,2,3,4))#返回值为 1.29 
var(x) #方差 
var(c(1,2,3,4))#返回值为 1.67 
mad(x) #绝对中位差(median absolute deviation) 
mad(c(1,2,3,4))#返回值为 1.48 
quantile(x,probs) #求分位数。其中 x 为待求分位数的数值型向量,probs 为一个由[0,1]之间的概率值组成的数值向量 
# 求 x 的 30%和 84%分位点 
y <- quantile(x, c(0.3,0.84)) 
range(x) #求值域 
x <- c(1,2,3,4) #range(x)返回值为 c(1,4) 
diff(range(x))#返回值为 3 
sum(x) #求和 
sum(c(1,2,3,4))#返回值为 10 
diff(x, lag=n) #滞后差分,lag 用以指定滞后几项。默认的 lag 值为 1 , 如果lag为1,就是表示后一个值减去前一个值得到的向量;如果lag=2,表示第第三个值减去第一个值的差,依次减到最后一项。
x<- c(1, 5, 23, 29) 
diff(x) #返回值为 c(4, 18, 6) 
min(x) #求最小值 
min(c(1,2,3,4))#返回值为 1 
max(x) #求最大值 
max(c(1,2,3,4))#返回值为 4 
scale(x,center=TRUE, scale=TRUE) 
#为数据对象 x 按列进行中心化(center=TRUE)或标准化(center=TRUE,scale=TRUE);

概率函数

概率分布的缩写如下:
在这里插入图片描述
概率函数:
d = 密度函数(density)
p = 分布函数(distribution function)
q = 分位数函数(quantile function)
r = 生成随机数(随机偏差)

正是概率函数和分布函数相组合构成了R的函数。

# 正态分布的函数
# 求分位数
data = quantile(mtcars$carb,c(0.8,0.5)) # mtcars$carb 数据中的0.8和0.5分位数

# 分位数函数
qnorm(0.5,mean=100,sd=50) # 求均值为100,方差为50的正态分布的0.5分位数是多少
#随机正态数函数
rnorm(20,meand=50, sd=30) # 生成20个均值为50,方差为30的正态分布随机数
# 分布函数
pnorm(1.96)   # 可以理解在标准正态分布中,x取值下小于1.96的概率。(对应双尾检验,如果不懂的话可以看一下统计学中的假设检验的书籍。)
# 密度分布函数
dnorm(mtcars$carb)   # 求mtcars的card列数据的密度分布

字符处理函数

统计函数都是为了处理数值型数据,而字符型函数就是为了处理字符型的数据。

nchar(x) # 计算 x 中的字符长度 
x <- c("ab", "cde", "fghij") # length(x)返回的向量长度,值为3
nchar(x[3])# 返回值为 5 

substr(x, start, stop) #提取或替换一个字符向量中的子串 
x <- "abcdef" 
substr(x, 2, 4)#返回值为"bcd" 
substr(x, 2, 4) <- "22222"#(x 将变成"a222ef") 

grep(pattern, x, ignore. 
case=FALSE, fixed=FALSE) #在 x 中搜索某种模式。若 fixed=FALSE,则 pattern 为一个正则表达式。若fixed=TRUE,则 pattern 为一个文本字符串。返回值为匹配的下标 
grep("A",c("b","A","c"),fixed=TRUE)#返回值为 2 
sub(pattern, replacement, 
x, ignore.case=FALSE, 
fixed=FALSE) 
#在 x 中搜索 pattern,并以文本 replacement 将其替换。若 fixed=FALSE,则pattern 为一个正则表达式。若 fixed=TRUE,则 pattern 为一个文本字符串。 
sub("\\s",".","Hello There") #返回值为 Hello.There。注意,"\s"是一个用来查找空白的正则表达式;使用"\\s"而不用"\"的原因是,后者是 R中的转义字符

strsplit(x, split, fixed=FALSE) 
#在 split 处分割字符向量 x 中的元素。若 fixed=FALSE,则 pattern 为一个正则表达式。若 fixed=TRUE,则 pattern 为一个文本字符串 
y <- strsplit("abc", "")#将返回一个含有 1个成分、3个元素的列表,包含的内容为"a" "b" "c" 

paste(, sep="") #连接字符串,分隔符为 sep 
paste("x",1:3,sep="M")#返回值为 c("xM1","xM2" "xM3") 
paste("Today is", date())#返回值为 Today is Thu Jun 25 14:17:32 2011

toupper(x) #大写转换 
toupper("abc")#返回值为"ABC" 
tolower(x) #小写转换 
tolower("ABC")#返回值为"abc"

其他实用函数

length(x) #对象 x 的长度 
x <- c(2, 5, 6, 9) 
length(x)#返回值为 4 
seq(from, to, by) #生成一个序列 
indices <- seq(1,10,2) #indices 的值为 c(1, 3, 5, 7, 9) 
rep(x, n) #将 x 重复 n 次 
y <- rep(1:3, 2) #y 的值为 c(1, 2, 3, 1, 2, 3) 
cut(x, n) #将连续型变量 x 分割为有着 n 个水平的因子 使用选项 ordered_result = TRUE 以创建一个有序型因子 
pretty(x, n) #创建美观的分割点。通过选取 n+1 个等间距的取整值,将一个连续型变量 x
分割为 n 个区间。绘图中常用 
cat(... , file ="myfile", 
append =FALSE) #连接...中的对象,并将其输出到屏幕上或文件中(如果声明了一个的话) 
firstname <- c("Jane") 
cat("Hello" ,firstname, "\n") 

示例

# 任务:依据三科分数进行分数的评定,并按照名字的firstname和lastname进行排序
options(digits=2) 

Student <- c("John Davis", "Angela Williams", "Bullwinkle Moose", 
               "David Jones", "Janice Markhammer", "Cheryl Cushing", 
               "Reuven Ytzrhak", "Greg Knox", "Joel England", 
               "Mary Rayburn") 
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(0.8,0.6,0.4,0.2))
attach(roster)
roster$grade[score >= y[1]] = "A"
roster$grade[score < y[1] & score >= y[2]] = "B"
roster$grade[score >= y[3] & score < y[2]] = "c"
roster$grade[score >= y[3] & score < y[4]] = "D"
roster$grade[score <y[4]] = "F"

# roster[order(grade),]
detach(roster)
name_sp = strsplit(roster$Student,split = " ")
name_sp[[1]]

# sapply(list, function) 对列表处理
firstname = sapply(name_sp, "[",1)  # 取列表的第一列
lastname = sapply(name_sp, "[",2)   # 取列表的第二列
roster = cbind(firstname,lastname,roster[,-1])
roster =roster[order(firstname,lastname),]
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值