高级数据管理
简单的数据管理只是有效的管理数据,二高级数据管理则是更近一步,只有充分了解r语言的控制流程,算术函数等,才可以更高效的处理数据。
为了方便,以下所有的分析,我都会基于r提供的原始数据进行分析。
本节目的
- 学习用于创建和转换变量的算术函数、字符处理函数和统计函数。
- 探索控制程序流程的方式之后,了解如何编写自己的函数。
- 如何使用这些函数来整合及概括数据。
一. 数值和字符处理函数
> 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),]