######第五章:高级数据管理#######
####5.1一个数据处理难题#####
#这一章给出了一个表格,我存在了table5_1.csv文件中
#现在导入这个文件
getwd()
setwd("E:/3codes/newsets") #这里设置成自己的工作目录,记得用/或者\\
dataframe <- read.table("table5_1.csv", header = T, sep = ",") #这里的选项必须这么选
#解决的问题有以下几点:
#1、需要将科目的数据整合起来
#2、前20%的学生评定为A,接下来20%评定为B,依此类推
#3、需要按字母顺序排序
#面临的问题有以下几点:
#1、3科考试无法比较,他们的均值和标准差相差甚远
#2、为了评定等级,需要一种方法来确定某个学生在各学科的百分比排名
#3、表示名字的字段只有一个,无法排序,需要将姓名分开
#####5.2数据处理函数和字符处理函数#####
####5.2.1数学函数####
#以下列出了常用数学函数及示例
abs(x) #绝对值
sqrt(x) #平方根,与x^0.5等价
ceiling(x) #不小于x的最小整数,例如ceiling(3.475)等于4(向上取整)
floor(x) #不大于x的最大整数,例如floor(3.475)等于3(向下取整)
trunc(x) #直接取整
round(x, digits = n) #将x保留n位的小数,例如round(3.475, digits = 2)结果是3.48
signif(x, digits = n) #将x保留n位的有效数字,例如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) #反双曲余弦、反双曲正弦和反双曲正切(说实话,上面3个我还真不知道是啥⊙﹏⊙b汗)
log(x, base = n) #对x取n为底的对数
log(x) #自然对数
log10(x) #常用对数
exp(x) #指数函数,例如exp(2.3026)结果是10
####5.2.2统计函数####
#许多统计函数都有选项,例如
z <- mean(x, trim = 0.05, na.rm = TRUE)
#代表剔除最大和最小5%的数据,并剔除了缺失值
#以下为表5-3常用的统计函数
mean() #均数
median() #中位数
sd() #方差
var() #标准差
mad() #绝对中位差:所有数据减去中位数后得到的值的中位数
quantile(x, probs) #x为一组数值型向量,probs是需要求的百分位数,为0-1之间
range() #求值域(不清楚,应该用不到吧,John注)
sum() #求和
diff(x, lag = n) #滞后差分,lag用于指定滞后几项,默认值为1(不清楚,应该用不到吧,John注)
min() #求最小值
max() #求最大值
scale(x, center = TRUE, scale = TRUE) #为数据对象x按列进行中心化(center = TRUE)或标准化(center = TRUE, scale = TRUE)
#以下是5-1代码清单,前半部分是快捷运算,后半部分是分布运算
x <- c(1,2,3,4,5,6,7,8)
mean(x)
sd(x)
n <- length(x) #计算出x的长度,即有多少个数
meanx <- sum(x)/n
css <- sum((x - meanx)^2)
sdx <- sqrt(css/(n-1))
meanx
sdx
#scale()函数可以对矩阵或者数据库进行标准化,默认均值为0,标准差为1(标准正态分布?)
#后续如果需要可以参照书第85页
####5.2.3概率函数####
#概率函数通常用来生成特征已知的模拟数据,或者在用户自定义的统计函数中计算概率值。
#在R中,概率函数形如:
#[dpqr]<概率分布缩写>()
#其中第一个字母表示其所指分布的某一方面。
#d=密度函数(density)
#p=分布函数(distribution function)
#q=分位数函数(quantile function)
#r=生成随机数(随机偏差)
#以下是上面这组分布的帮助文件:
dnorm(x, mean = 0, sd = 1, log = FALSE)
pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
rnorm(n, mean = 0, sd = 1)
#表5-4列出了常用的概率函数。
#这里我建立了一个数据框,自行运行看看,对应书第86页:
names <- c("beta分布", "二项分布", "柯西分布", "(非中心)卡方分布", "指数分布", "F分布", "Gamma分布", "几何分布", "超几何分布", "对数正态分布", "Logistic分布", "多项分布", "负二项分布", "正态分布", "泊松分布", "Wilcoxon 符号秩分布", "t分布", "均匀分布", "Weibull分布", "Wilcoxon秩和分布")
abbreviation <- c("beta", "binom", "cauchy", "chisq", "exp", "f", "gamma", "geom", "hyper", "lnorm", "logis", "multinom", "nbinom", "norm", "pois", "signrank", "t", "unif", "weibull", "wilcox")
frame5.1 <- data.frame(names, abbreviation)
frame5.1
#(John注)这张表大部分对应的内容都用得上,希望可以背下来。
#书第87页代码为正态分布示例
#如果不指定均值和标准差,则函数将假定为标准正态分布
#在[-3,3]上绘制标准正态分布
library(ggplot2) #运行ggplot2包
x <- seq(from = -3, to = 3, by = 0.1) #生成一个序列:最小值是-3,最大值是3,以0.1递增
y = dnorm(x) #dnorm(x, mean = 0, sd = 1),这里的x帮助文件中叫vector of quantiles.翻译为分位置响亮,不明白(John注)(ChatGPT说x如果是一个向量,dnorm(x)将返回与x中的每个值相对应的正太分布密度函数值)
data <- data.frame(x = x, y = y) #生成一个数据框
ggplot(data, aes(x, y)) + #制图
geom_line() +
labs(x = "Normal Deviate",
y = "Density") +
scale_x_continuous(breaks = seq(-3, 3, 1))
#位于z=1.96左侧的标准正态曲线下方面积是多少?
pnorm(1.96) #单侧0.25
#均值为500.标准差为100的正态分布的0.9分位点值为多少?
qnorm(.9, mean = 500, sd = 100)
#生成50个均值为50,标准差为10的正态随机数
rnorm(50, mean = 50, sd = 10)
#以上三个是直接出答案的(我到这里已经有点跟不上了,速度很慢,John注)
##1、设定随机数种子
#这个种子相当于一个动态指令,每次生成伪随机数字时R都会随机生成一个这样的种子,每个种子代表能产生的结果
#所以每次得到的随机数都不相同,但可以认为控制随机的种子,从而使制定种子的随机结果相同。(类似与用一个表示为已生成的随机数定位的标识:John注)
#用set.seed()来制定种子,以下是书中5-2代码
runif(5)
runif(5)
set.seed(1234)
runif(5)
set.seed(1234)
runif(5)
#runif()函数是指生成一个均匀分布的随机数向量
#其函数表达式是runif(n, min = 0, max = 1)
##2、生成多元正态数据
#在模拟研究和蒙特卡洛方法中需要获取给定均值向量和协方差阵的多元正态分布数据。
#这就需要MultiRNG包中的draw.d.variate.normal()函数,他的表达式是:
#draw.d.variate.normal(n, nvar, mean, sigma)
#其中n是想要的样本量,nvar是变量数,mean是均值向量,sigma是方差-协方差矩阵
#书88页有一个从三元正态分布中抽取500个变量值的代码如下:
install.packages("MultiRNG")
library(MultiRNG)
options(digits = 3)
set.seed(1234)
mean <- c(230.7, 146.7, 3.6)
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 <- draw.d.variate.normal(500, 3, mean, sigma) #生成500个伪随机的观测值,
mydata <- as.data.frame(mydata) #将数据从矩阵转为数据框
names(mydata) <- c("y", "x1", "x2")
dim(mydata)
head(mydata, n =10)
#这部分看起来挺有用的,但目前不知道哪里能用,后面如果用到了再看一看把(John注)
####5.2.4字符处理函数####
#字符处理函数可以从文本中提取信息,或者为打印输出和生成报告重设文本的格式
#以下为表5-6中代码格式和解释
nchar(x) #计算x的字符数量
substr(x, start, stop) #提取或替换一个字符向量中的子串
grep(pattern, x, ignore.case = FALSE, fixed = FALSE) #在x中搜索某种模式,若fixed=FALSE,则pattern为一个正则表达式。若fixed=TRUE,则pat