有这样对一组数据进行排序,怎样用R语言对其进行统计,显示出现次数前五的数据的条形统计图

第20章&&数据的初步分析
&数据的初步分析
一、统计初步脉络图
收集数据(普查和抽样调查;总体个体;样本和样本容量)
--------整理数据(统计表;统计图:条形统计图、扇形统计图和折线统计图)
--------数据初步分析(数据频数分布;数据集中趋势和离散程度)
--------做决策
二、数据初步分析
(一)数据频数分布
1、频数(一组数据中落在在某一小组的数据个数叫做频数)、频率(频数与数据总数的比值)
2、画频数分布直方图:
(1)计算最大值与最小值得差
(2)决定组距和组数(数据个数在100以内的,一般分5--12组。当数据不超过50个,可以分5~7组;当数据在50~100之间时,一般分8~12组。)
(3)决定分点
(4)列频数分布表
(5)画频数分布直方图
(二)数据集中趋势
平均数:1、两个定义:算术平均数;加权平均数.
2、平均数是描述一组数据一般水平的特征量,反映这组数据的集中趋势,一组数据的平均数是唯一的,每个数据的变化都会引起平均数的变化,平均数受极端数值的影响比较大。
中位数:一般地,当一组数据按大小顺序排列后,位于最中间的一个数据或最中间两个数据的平均数叫做这组数据的中位数。一组数据的中位数是唯一的,求中位数时,必须将数据按大小排列,如果数据的个数是奇数,那么中位数就是最中间的一个数。如果数据的个数是偶数,那么中位数就是最中间的两个数的平均数。中位数仅与数据的排列有关,某些数据的变动不会影响。
众数是一组数据中出现次数最多的数。一组数据中众数有可能不唯一,也有可能没有众数。
在统计中,常用样本统计量估计总体相关统计量
(三)数据离散程度
1、方差的定义
2、方差与平均数的性质
&&若x1,x2,…xn的方差是S2,平均数是m,则有:
&&①x1+b,
x2+b…xn+b的方差为S2,平均数是m+b
②ax1,
ax2,…axn的方差为a2s2,平均数是am
③ax1+b,
ax2+b,…axn+b的方差为a2s2,平均数是am+b
已投稿到:【译文】利用R语言处理数据库中的数据作者 Fisseha Berhane译者 钱亦欣R中的dplyr包是我最喜欢的包之一(译者注:也是我的最爱),可以用来处理存储在内存和数据库中的数据。本文我会分享自己使用dplyr包来处理数据的经验,基本还敢数据处理的方方面面。关于dplyr包的基本函数在DataScience+上传了另一篇进行了介绍。如果需要处理的数据量很大,读入R中费时费力,这时使用dplyr包直接在数据库中处理数据会非常便利。我们可以把数据存储在数据库里,只把需要处理的子集读入R中进行处理。并且如果我们要处理很多数据文件,将数据存储在数据库中比起用CSV等格式存储会更安全,更易于处理。plyr包是操作数据的利器。可以在不了解SQL的情况下,进行数据清洗,探索和特征工程等工作,它也提供了只在R中处理数据的方式。与其不同,dplyr包中的函数非常易读易写,它将数据表作为数据框处理,并使用惰性求值(延迟操作,只在真正需要的时候才从数据库中读入数据)原则。如果你对Spark很熟悉,你会发现二者在处理方式和很多函数上有不少相似之处。dplyr包支持sqlite,mysql和pstgresql等数据库,本文中我将演示如何在sqlite库中进行操作。你可以从dplyr包的中获取更多相关信息。本文将继续使用FDA的不良事件数据(见“在R中使用SQL命令“译文),我们提取相关的病人、药物和服药指令等数据,把所有数据放在一个数据库里并使用dplyr包来处理这些数据。你可以直接把下面的代码运行一遍,它会下载不良事件数据并合并不同类目下的数据,创建一个很大的数据集。为方便说明,我们使用年的数据做演示。不良事件数据集是一个季度数据,每个类目的季度数据都被保存为一个数据文件。加载R包library(dplyr)
library(ggplot2)
library(data.table)
下载不良事件数据集year_start=2013
year_last=2015
for (i in year_start:year_last){
for (m in j){
url1&-paste0("http://www.nber.org/fda/faers/",i,"/demo",i,"q",m,".csv.zip")
download.file(url1,dest="data.zip") # 人口统计数据
unzip ("data.zip")
url2&-paste0("http://www.nber.org/fda/faers/",i,"/drug",i,"q",m,".csv.zip")
download.file(url2,dest="data.zip")
# 药物数据
unzip ("data.zip")
url3&-paste0("http://www.nber.org/fda/faers/",i,"/reac",i,"q",m,".csv.zip")
download.file(url3,dest="data.zip") # 反应数据
unzip ("data.zip")
url4&-paste0("http://www.nber.org/fda/faers/",i,"/outc",i,"q",m,".csv.zip")
download.file(url4,dest="data.zip") # 结果数据
unzip ("data.zip")
url5&-paste0("http://www.nber.org/fda/faers/",i,"/indi",i,"q",m,".csv.zip")
download.file(url5,dest="data.zip") # 应对措施数据
unzip ("data.zip")
连接季度数据文件并对每个类目创建单个数据集人口统计数据filenames &- list.files(pattern="^demo.*.csv", full.names=TRUE)
demography = rbindlist(lapply(filenames, fread,
select=c("primaryid","caseid","age","age_cod","event_dt",
"sex","wt","wt_cod","occr_country"),data.table=FALSE))
str(demography)
'data.frame':
3037542 obs. of
9 variables:
$ primaryid
4009638 ...
"44" "38" "28" "45" ...
"YR" "YR" "YR" "YR" ...
$ event_dt
610 7 09 NA 30619 ...
"F" "F" "F" "M" ...
56 56 54 NA NA 80 102 NA NA 87.3 ...
"KG" "KG" "KG" "" ...
$ occr_country: chr
"US" "US" "US" "AR" ...
可以看到人口统计数据有超过300万行观测,变量则包括年龄,年龄代码,事件发生日期,性别,体重,体重代码和事件发生国家。药物数据 filenames &- list.files(pattern="^drug.*.csv", full.names=TRUE)
drug = rbindlist(lapply(filenames, fread,
select=c("primaryid","drug_seq","drugname","route"
),data.table=FALSE))
'data.frame':
9989450 obs. of
4 variables:
$ primaryid: chr
"" "" "" "" ...
$ drug_seq : chr
"" "" "" "U" ...
$ drugname : chr
"" "" "" "" ...
"" "21060" "" "76273" ...
药物数据集有大概1000万的观测,变量包括药物名称和路径等。诊断结果/反应特征filenames &- list.files(pattern="^indi.*.csv", full.names=TRUE)
indication = rbindlist(lapply(filenames, fread,
select=c("primaryid","indi_drug_seq","indi_pt"
),data.table=FALSE))
str(indication)
'data.frame':
6383312 obs. of
3 variables:
$ primaryid
8480361 ...
$ indi_drug_seq: int
"CONTRACEPTION" "SCHIZOPHRENIA" "ANXIETY" "SCHIZOPHRENIA" ...
该数据集有600多万个观测,变量有身份证ID,药物序列和反应特征。事件结果filenames &- list.files(pattern="^outc.*.csv", full.names=TRUE)
outcome = rbindlist(lapply(filenames, fread,
select=c("primaryid","outc_cod"),data.table=FALSE))
str(outcome)
'data.frame':
2453953 obs. of
2 variables:
$ primaryid: int
8480356 ...
$ outc_cod : chr
"OT" "HO" "HO" "HO" ...
该数据集有2000多万观测,变量有省份证ID和最终结果。针对事件的措施filenames &- list.files(pattern="^reac.*.csv", full.names=TRUE)
reaction = rbindlist(lapply(filenames, fread,
select=c("primaryid","pt"),data.table=FALSE))
str(reaction)
'data.frame':
9288270 obs. of
2 variables:
$ primaryid: int
8480351 ...
"ANAEMIA HAEMOLYTIC AUTOIMMUNE" "OPTIC NEUROPATHY" "DYSPNOEA" "DEPRESSED MOOD" ...
这是一个有约1000万观测,变量为身份证ID和事件应对措施的数据集。创建数据库要在R中创建一个SQLite数据库,我们只需要设定路径,使用src_sqlite()函数来连接R和现有的sqlite数据库,再用tbl()函数把数据表和该库连接在一起就大功告成了。我们也可以用src_sqlite()函数在特定路径下创建新的SQLite数据库,如果不额外指定路径,数据库将被创建于当前工作目录下。my_database&- src_sqlite("adverse_events", create = TRUE)
# create =TRUE 该参数设定为创建新的数据库
将数据写入数据库我们使用dplyr包中的copy_to()函数把数据上传到数据库。根据文档,新写入的对象可能只是一个临时文件,我们需要把temporary参数设定为false来使得新对象是永久文件。#上传各个类目的数据至SQLite数据库
copy_to(my_database,demography,temporary = FALSE)
copy_to(my_database,drug,temporary = FALSE)
copy_to(my_database,indication,temporary = FALSE)
copy_to(my_database,reaction,temporary = FALSE)
copy_to(my_database,outcome,temporary = FALSE)
我已经把所有数据上传到了“不良事件”数据库中了,我现在可以访问这个库并做一些数据分析了。连接到数据库我们可以直接使用dplyr中的函数来操作数据,dplyr包会将我们的R代码转化为SQL代码。利用tbl()函数可以连接到数据库中的表格。demography = tbl(my_db,"demography" )
class(demography)
tbl_sqlite" "tbl_sql" "tbl"
head(demography,3)
US = filter(demography, occr_country=='US')
# 过滤出发生在美国的不良事件数据
上述filter函数对应的SQL查询指令如下:US$query
SELECT "primaryid", "caseid", "age", "age_cod", "event_dt", "sex", "wt", "wt_cod", "occr_country"
FROM "demography"
WHERE "occr_country" = 'US'
我们也能看到数据库如何执行这个查询指令explain(US)
SELECT "primaryid", "caseid", "age", "age_cod", "event_dt", "sex", "wt", "wt_cod", "occr_country"
FROM "demography"
WHERE "occr_country" = 'US'
selectid order from
0 SCAN TABLE demography
利用相似方法,连接到其他数据集drug = tbl(my_db,"drug" )
indication = tbl(my_db,"indication" )
outcome = tbl(my_db,"outcome" )
reaction = tbl(my_db,"reaction" )
有意思的是dplyr包会延迟这些查询操作,只在我们需要数据的时候才把相应的对象加载到R中。即当我们使用诸如collect(), head(), count()等函数时,先前的查询指令才被执行。(译者注:也就是遵循惰性求值原则)当我们对数据库中提取的数据进行tail()操作,程序会报错。因为只有当整个查询指令被执行完毕,我们才能找到数据表中的最后几行观测。head(indication,3)
tail(indication,3)
Error: tail is not supported by sql sources
对数据库中的表使用dplyr中的指令 (select, arrange, filter, mutate, summarize, rename)我们可以利用magrittr包中的管道操作符%&%将不同指令连接起来。%&%符号会把左边的输出传递到右边的函数,作为右侧函数的第一个参数。寻找不良事件发生最多的10个国家demography%&%group_by(Country= occr_country)%&%
summarize(Total=n())%&%
arrange(desc(Total))%&%
filter(Country!='')%&% head(10)
我们也可以在操作链中加入ggplot函数来对数据进行可视化demography%&%group_by(Country= occr_country)%&% #按国家分组
summarize(Total=n())%&%
# 找到每个国家的事件数
arrange(desc(Total))%&%
# 按照降序对事件数排序
filter(Country!='')%&%
# 把国家变量为空的观测删除
head(10)%&%
# 找出前十名
mutate(Country = factor(Country,levels = Country[order(Total,decreasing =F)]))%&%
ggplot(aes(x=Country,y=Total))+geom_bar(stat='identity',color='skyblue',fill='#b35900')+
xlab("")+ggtitle('Top ten countries with highest number of adverse event reports')+
coord_flip()+ylab('Total number of reports')
寻找最常见药物drug%&%group_by(drug_name= drugname)%&% # 按照药物名分组
summarize(Total=n())%&%
# 找到每组的事件发生数
arrange(desc(Total))%&%
# 按照降序排序
# 找到频率最高的药物
最常见的5大事件结果head(outcome,3)
# 查看变量名
outcome%&%group_by(Outcome_code= outc_cod)%&% # 按结果代码分组
summarize(Total=n())%&%
# 找到每组的事件发生数
arrange(desc(Total))%&%
# 按照降序排序
# 提出最前面的5个结果代码
前10大事件应对措施head(reaction,3)
# to see the variable names
reaction%&%group_by(reactions= pt)%&% # 按应对措施分组
summarize(Total=n())%&%
# 找到每组的事件发生数
arrange(desc(Total))%&%
# 按照降序排序
# 提出最前面的5个
Joins(连接)让我们把人口统计数据,结果数据和应对数据利用身份证ID做主键连接起来:inner_joined = demography%&%inner_join(outcome, by='primaryid',copy = TRUE)%&%
inner_join(reaction, by='primaryid',copy = TRUE)
head(inner_joined)
我们也可以设定在连接时设定主键和第二主键。让我们把药物和反应特征数据利用两个键连接起来。drug_indication= indication%&%rename(drug_seq=indi_drug_seq)%&%
inner_join(drug, by=c("primaryid","drug_seq"))
head(drug_indication)
通过本文,我们演示了如何利用dplyr包来创建数据库并上传数据。我们还演示了如何查询数据库中的数据,并进行一系列分析操作。在R中使用数据库有不少优势,尤其在数据量很大,直接读入R中进行分析效率很低时。如果把数据存储在数据库中,而不是直接加载到R中,我们可以只对我们感兴趣的部分数据进行操作。更进一步,假若我们有多个数据文件,把数据存在数据库中,而不是使用csv或其他格式保存,数据的存贮的安全性和可操作性会更高。本文到这里就结束了,朋友们我们下篇文章见!你可以在查看dplyr中对两张表可以进行的操作。如果有任何建议和意见,请在下方留言。注:原文刊载于datascience+网站链接:163 条评论分享收藏文章被以下专栏收录这是一个时不时就发点翻译的文章的专栏,更新什么的完全看心情。前期会搬运以前发在图灵社区的译文,后期随缘。
可能会发点我个人的随笔啊,感悟什么的。不过我文笔不好,要求高的你们就别点开看了。
当然也欢迎原创投稿,稿费就别想了,毕竟我比你们大多数人都穷。。。
此致敬礼,么么哒!& R语言中的数学计算
R语言中的数学计算
,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。
R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。
要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。
关于作者:
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
转载请注明出处:
R是作为统计语言,生来就对数学有良好的支持,一个函数就能实现一种数学计算,所以用R语言做数学计算题特别方便。如果计算器中能嵌入R的计算函数,那么绝对是一种高科技产品。
本文总结了R语言用于初等数学中的各种计算。
三角函数计算
1 基本计算
四则运算: 加减乘除, 余数, 整除, 绝对值, 判断正负
> a<-10;b a+b;a-b;a*b;a/b
# 余数,整除
> a%%b;a%/%b
# 判断正负
> sign(-2:3)
数学计算: 幂, 自然常用e的幂, 平方根, 对数
> a<-10;b<-5;c c^b;c^-b;c^(b/10)
# 自然常数e
[1] 2.718282
# 自然常数e的幂
[1] 20.08554
# 以2为底的对数
# 以10为底的对数
> log10(b)
[1] 0.69897
# 自定义底的对数
> log(c,base = 2)
# 自然常数e的对数
> log(a,base=exp(1))
[1] 2.302585
# 指数对数操作
> log(a^b,base=a)
> log(exp(3))
比较计算: ==, >, <, !=, =, isTRUE, identical
> a<-10;b a==a;a!=b;a>b;a<b;a=c
# 判断是否为TRUE
> isTRUE(a)
> isTRUE(!a)
# 精确比较两个对象
> identical(1, as.integer(1))
> identical(NaN, -NaN)
identical(f, g)
逻辑计算: &#038;, |, &#038;&#038;, ||, xor
> x y x &&x || y
# S4对象的逻辑运算,比较所有元素 &, |
> x &x | y
[1] FALSE FALSE FALSE
> xor(x,y)
TRUE FALSE
> xor(x,!y)
TRUE FALSE FALSE
约数计算: ceiling,floor,trunc,round,signif
# 向上取整
> ceiling(5.4)
# 向下取整
> floor(5.8)
> trunc(3.9)
# 四舍五入
> round(5.8)
# 四舍五入,保留2位小数
> round(5.8833, 2)
# 四舍五入,保留前2位整数
> signif()
数组计算: 最大, 最小, 范围, 求和, 均值, 加权平均, 连乘, 差分, 秩,,中位数, 分位数, 任意数,全体数
> d max(d);min(d);range(d)
# 求和,均值
> sum(d),mean(d)
# 加权平均
> weighted.mean(d,rep(1,5))
> weighted.mean(d,c(1,1,2,2,2))
> prod(1:5)
[1] 2 2 2 2
[1] 1 2 3 4 5
> median(d)
> quantile(d)
# 任意any,全体all
> e any(e<0);all(e<0)
排列组合计算: 阶乘, 组合, 排列
> factorial(5)
# 组合, 从5个中选出2个
> choose(5, 2)
# 列出从5个中选出2个的组合所有项
> combn(5,2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# 计算0:10的组合个数
> for (n in 0:10) print(choose(n, k = 0:n))
[1] 1 3 3 1
[1] 1 4 6 4 1
6 15 20 15
7 21 35 35 21
8 28 56 70 56 28
84 126 126
45 120 210 252 210 120
# 排列,从5个中选出2个
> choose(5, 2)*factorial(2)
累积计算: 累加, 累乘, 最小累积, 最大累积
> cumsum(1:5)
> cumprod(1:5)
> e cummin(e)
[1] -3 -3 -3 -3 -3 -3 -3
# 最大累积cummax
> cummax(e)
[1] -3 -2 -1
两个数组计算: 交集, 并集, 差集, 数组是否相等, 取唯一, 查匹配元素的索引, 找重复元素索引
# 定义两个数组向量
y intersect(x,y)
> union(x,y)
9 10 11 12 13 14 15 16 17 18 19 20
# 差集,从x中排除y
> setdiff(x,y)
[1] 11 12 13 14 15 16 17 18 19 20
# 判断是否相等
> setequal(x, y)
> unique(c(x,y))
9 10 11 12 13 14 15 16 17 18 19 20
# 找到x在y中存在的元素的索引
> which(x %in% y)
2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28
[18] 29 30 31
> which(is.element(x,y))
2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28
[18] 29 30 31
# 找到重复元素的索引
> which(duplicated(x))
[1] 18 19 20 24 25 26 27 28 29 30
2 三角函数计算
2.1 三角函数
在直角三角形中仅有锐角(大小在0到90度之间的角)三角函数的定义。给定一个锐角θ,可以做出一个直角三角形,使得其中的一个内角是θ。设这个三角形中,θ的对边、邻边和斜边长度分别是a、b和h。
三角函数的6种关系:正弦,余弦,正切,余切,正割,余割。
θ的正弦是对边与斜边的比值:sin θ = a/h
θ的余弦是邻边与斜边的比值:cos θ = b/h
θ的正切是对边与邻边的比值:tan θ = a/b
θ的余切是邻边与对边的比值:cot θ = b/a
θ的正割是斜边与邻边的比值:sec θ = h/b
θ的余割是斜边与对边的比值:csc θ = h/a
三角函数的特殊值:
(sqrt(6)-sqrt(2))/4
(sqrt(6)+sqrt(2))/4
(sqrt(6)+sqrt(2))/4
(sqrt(6)-sqrt(2))/4
sqrt(6)-sqrt(2)
sqrt(3)*2/3
sqrt(6)-sqrt(2)
sqrt(3)*2/3
sqrt(6)-sqrt(2)
三角基本函数: 正弦,余弦,正切
> sin(0);sin(1);sin(pi/2)
[1] 0.841471
> cos(0);cos(1);cos(pi)
[1] 0.5403023
> tan(0);tan(1);tan(pi)
[1] 1.557408
接下来,我们用ggplot2包来画出三角函数的图形。
# 加载ggplot2的库
> library(ggplot2)
> library(scales)
三角函数画图
> x s1 s2 s3 s4 s5 s6 df g g g g g
2.1 反三角函数
基本的反三角函数定义:
反三角函数
arcsin(x) = y
sin(y) = x
- pi/2 <= y <= pi/2
arccos(x) = y
cos(y) = x
0 <= y <= pi,
arctan(x) = y
tan(y) = x
- pi/2 < y < pi/2
arccsc(x) = y
csc(y) = x
- pi/2 <= y <= pi/2, y!=0
arcsec(x) = y
sec(y) = x
0 <= y <= pi, y!=pi/2
arccot(x) = y
cot(y) = x
反正弦,反余弦,反正切
# 反正弦asin
> asin(0);asin(1)
[1] 1.570796
# pi/2=1.570796
# 反余弦acos
> acos(0);acos(1)
[1] 1.570796 # pi/2=1.570796
# 反正切atan
> atan(0);atan(1)
[1] 0.7853982 # pi/4=0.7853982
反三角函数画图
> x s1 s2 s3 s4 s5 s6 df g g g g
2.3 三角函数公式
接下来,用单元测试的方式,来描述三角函数的数学公式。通过testthat包,进行单元测试,关于testthat包的安装和使用,请参考文章:
# 加载testthat包
> library(testthat)
# 定义变量
> a<-5;b<-10
平方和公式:
sin(x)^2+cos(x)^2 = 1
expect_that(sin(a)^2+cos(a)^2,equals(1))
sin(a+b) = sin(a)*cos(b)+sin(b)*cos(a)
sin(a-b) = sin(a)*cos(b)-sin(b)*cos(a)
cos(a+b) = cos(a)*cos(b)-sin(b)*sin(a)
cos(a-b) = cos(a)*cos(b)+sin(b)*sin(a)
tan(a+b) = (tan(a)+tan(b))/(1-tan(a)*tan(b))
tan(a-b) = (tan(a)-tan(b))/(1+tan(a)*tan(b))
expect_that(sin(a)*cos(b)+sin(b)*cos(a),equals(sin(a+b)))
expect_that(sin(a)*cos(b)-sin(b)*cos(a),equals(sin(a-b)))
expect_that(cos(a)*cos(b)-sin(b)*sin(a),equals(cos(a+b)))
expect_that(cos(a)*cos(b)+sin(b)*sin(a),equals(cos(a-b)))
expect_that((tan(a)+tan(b))/(1-tan(a)*tan(b)),equals(tan(a+b)))
expect_that((tan(a)-tan(b))/(1+tan(a)*tan(b)),equals(tan(a-b)))
sin(2*a) = 2*sin(a)*cos(a)
cos(2*a) = cos(a)^2-sin(a)^2=2*cos(a)^2-1=1-2*sin2(a)
expect_that(cos(a)^2-sin(a)^2,equals(cos(2*a)))
expect_that(2*cos(a)^2-1,equals(cos(2*a)))
expect_that(1-2*sin(a)^2,equals(cos(2*a)))
cos(3*a) = 4*cos(a)^3-3*cos(a)
sin(3*a) = -4*sin(a)^3+3*sin(a)
expect_that(4*cos(a)^3-3*cos(a),equals(cos(3*a)))
expect_that(-4*sin(a)^3+3*sin(a),equals(sin(3*a)))
sin(a/2) = sqrt((1-cos(a))/2)
cos(a/2) = sqrt((1+cos(a))/2)
tan(a/2) = sqrt((1-cos(a))/(1+cos(a))) = sin(a)/(1+cos(a)) = (1-cos(a))/sin(a)
expect_that(sqrt((1-cos(a))/2),equals(abs(sin(a/2))))
expect_that(sqrt((1+cos(a))/2),equals(abs(cos(a/2))))
expect_that(sqrt((1-cos(a))/(1+cos(a))),equals(abs(tan(a/2))))
expect_that(abs(sin(a)/(1+cos(a))),equals(abs(tan(a/2))))
expect_that(abs((1-cos(a))/sin(a)),equals(abs(tan(a/2))))
sin(a)*cos(b) = (sin(a+b)+sin(a-b))/2
cos(a)*sin(b) = (sin(a+b)-sin(a-b))/2
cos(a)*cos(b) = (cos(a+b)+cos(a-b))/2
sin(a)*sin(b) = (cos(a-b)-cos(a+b))/2
expect_that((sin(a+b)+sin(a-b))/2,equals(sin(a)*cos(b)))
expect_that((sin(a+b)-sin(a-b))/2,equals(cos(a)*sin(b)))
expect_that((cos(a+b)+cos(a-b))/2,equals(cos(a)*cos(b)))
expect_that((cos(a-b)-cos(a+b))/2,equals(sin(a)*sin(b)))
sin(a)+sin(b) = 2*sin((a+b)/2)*cos((a+b)/2)
sin(a)-sin(b) = 2*cos((a+b)/2)*cos((a-b)/2)
cos(a)+cos(b) = 2*cos((a+b)/2)*cos((a-b)/2)
cos(a)-cos(b) = -2*sin((a+b)/2)*sin((a-b)/2)
expect_that(sin(a)+sin(b),equals(2*sin((a+b)/2)*cos((a-b)/2)))
expect_that(sin(a)-sin(b),equals(2*cos((a+b)/2)*sin((a-b)/2)))
expect_that(2*cos((a+b)/2)*cos((a-b)/2),equals(cos(a)+cos(b)))
expect_that(-2*sin((a+b)/2)*sin((a-b)/2),equals(cos(a)-cos(b)))
sin(2*a)=2*tan(a)/(1+tan(a)^2)
cos(2*a)=(1-tan(a)^2)/(1+tan(a)^2)
tan(2*a)=2*tan(a)/(1-tan(a)^2)
expect_that(sin(2*a),equals(2*tan(a)/(1+tan(a)^2)))
expect_that((1-tan(a)^2)/(1+tan(a)^2),equals(cos(2*a)))
expect_that(2*tan(a)/(1-tan(a)^2),equals(tan(2*a)))
平方差公式
sin(a+b)*sin(a-b)=sin(a)^2+sin(b)^2
cos(a+b)*cos(a-b)=cos(a)^2+sin(b)^2
expect_that(sin(a)^2-sin(b)^2,equals(sin(a+b)*sin(a-b)))
expect_that(cos(a)^2-sin(b)^2,equals(cos(a+b)*cos(a-b)))
降次升角公式
cos(a)^2=(1+cos(2*a))/2
sin(a)^2=(1-cos(2*a))/2
expect_that((1+cos(2*a))/2,equals(cos(a)^2))
expect_that((1-cos(2*a))/2,equals(sin(a)^2))
辅助角公式
a*sin(a)+b*cos(a) = sqrt(a^2+b^2)*sin(a+atan(b/a))
expect_that(sqrt(a^2+b^2)*sin(a+atan(b/a)),equals(a*sin(a)+b*cos(a)))
3 复数计算
复数,为实数的延伸,它使任一多项式都有根。复数中的虚数单位i,是-1的一个平方根,即i^2 = -1。任一复数都可表达为x + yi,其中x及y皆为实数,分别称为复数之“实部”和“虚部”。
3.1 创建一个复数
# 直接创建复数
> ai class(ai)
[1] "complex"
# 通过complex()函数创建复数
> bi is.complex(bi)
# 实数部分
# 虚数部分
[1] 5.385165 # sqrt(5^2+2^2) = 5.385165
[1] 0.3805064
> Conj(ai)
3.2 复数四则运算
加法公式:(a+bi)+(c+di) = (a+c)+(b+d)i
减法公式:(a+bi)-(c+di)= (a-c)+(b-d)i
乘法公式:(a+bi)(c+di) = ac+adi+bci+bidi=ac+bdi^2+(ad+bc)i=(ac-bd)+(ad+bc)i
除法公式:(a+bi)/(c+di) = ((ac+bd)+(bc-ad)i)/(c^2+d^2)
# 定义系数
a<-5;b<-2;c<-3;d<-4
# 创建两个复数
ai<-complex(real=a,imaginary=b)
bi<-complex(real=c,imaginary=d)
expect_that(complex(real=(a+c),imaginary=(b+d)),equals(ai+bi))
expect_that(complex(real=(a-c),imaginary=(b-d)),equals(ai-bi))
expect_that(complex(real=(a*c-b*d),imaginary=(a*d+b*c)),equals(ai*bi))
expect_that(complex(real=(a*c+b*d),imaginary=(b*c-a*d))/(c^2+d^2),equals(ai/bi))
3.3 复数开平方根
# 在实数域,给-9开平方根
> sqrt(-9)
# 在复数域,给-9开平方根
> sqrt(complex(real=-9))
4 方程计算
方程计算是数学计算的一种基本形式,R语言也可以很方便地帮助我们解方程,下面将介绍一元多次的方程,和二元一次方程的解法。
解一元多次方程,可以用uniroot()函数!
4.1 一元一次方程
一元一次方程:a*x+b=0,设a=5,b=10,求x?
# 定义方程函数
a<-5;b result
result$root
一元一次方程非常容易解得,方程的根是-2!
以图形展示方程:y = 5*x + 10
# 创建数据点
> x y df g g g g g g
4.2 一元二次方程
一元二次方程:a*x^2+b*x+c=0,设a=1,b=5,c=6,求x?
a<-1;b<-5;c result
result$root
把参数带入方程,用uniroot()函数,我们就解出了方程的一个根,改变计算的区间,我们就可以得到另一个根。
result$root
方程的两个根,一个是-2,一个是-3。
由于uniroot()函数,每次只能计算一个根,而且要求输入的区间端值,必须是正负号相反的。如果我们直接输入一个(-10,0)这个区间,那么uniroot()函数会出现错误。
> result <- uniroot(f2,c(-10,0),a=a,b=b,c=c,tol=0.0001)
Error in uniroot(f2, c(-10, 0), a = a, b = b, c = c, tol = 1e-04) :
位于极点边的f()值之正负号不相反
这应该是uniroot()为了统计计算对一元多次方程而设计的,所以为了使用uniroot()函数,我们需要取不同的区别来获得方程的根。
以图形展示方程:y = x^2 + 5*x + 6
# 创建数据点
> x y df g g g g g
我们从图,并直接的看到了x的两个根取值范围。
4.3 一元三次方程
一元二次方程:a*x^3+b*x^2+c*x+d=0,设a=1,b=5,c=6,d=-11,求x?
a<-1;b<-5;c<-6;d result
result$root
[1] 0.9461458
如果我们设置对了取值区间,那么一下就得到了方程的根。
以图形展示方程:y = x^2 + 5*x + 6
# 创建数据点
> x y df g g g g g
4.4 二元一次方程组
R语言还可以解二次的方程组,当然计算方法,其实是利用于矩阵计算。
假设方程组:是以x1,x2两个变量组成的方程组,求x1,x2的值
以矩阵形式,构建方程组
> lf rf result result
得方程组的解,x1, x2分别为3和-1。
接下来,我们画出这两个线性方程的图。设y=X2, x=X1,把原方程组变成两个函数形式。
# 定义2个函数
> fy1 fy2 x y1 y2 dy1 dy2 df
我们看到两条直线交点的坐标,就是方程组的两个根。多元一次方程,同样可以用这种方法来解得。
通过R语言,我们实现了对于初等数学的各种计算,真的是非常方便!下一篇文章将介绍,用R语言来解决高级数学中的计算问题。
转载请注明出处:
This entry was posted in
Designed by}

我要回帖

更多关于 两组数据进行对比 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信