目录
- 0.问题导入
- 1.情景1:生成等差数列
- 2.情景2:生成一个重复数列
- 3.情景3:生成一个给定范围及大小的随机数列
- 4.情景4:生成一个给定大小的正态分布的数列
- 5.总结
- 6.本篇所用的R-packages(没有的需要用install.packages()进行安装)
- 7.致谢
- 8.号外!TheWhoOPs平台与全国地研联公众号实现线上战略合作
0. 问题导入
在我们日常数据处理过程中,我们可能会遇到:
情景1:生成等差数列。 举个栗子,比如,我们现在有一个12✖️12的矩阵,我们只需要筛选1,3,5,7,9列这种情景。
情景2:生成一个重复数列。 比如1,1,1,1,2,2,2,2;或者1,2,3,4,1,2,3,4;
情景3:生成一个给定范围及大小的随机数列。
情景4:生成一个给定大小的正态分布的数列。
今天我们先就以上几个情景列举几个R语言中好用的“小函数”,当然R语言中高效好用的小函数还有很多,今天是番一,我们之后会说不定啥时候再慢慢更下去哈~
1. 情景1:生成等差数列
在R语言中我们可以使用 seq() 这个函数进行生成等差数列,seq是sequence(序列)的缩写。函数结构如下:
seq(start, end, step)
- start: 起始的数字
- end: 终止的数字
- step: 步长
来,我们单讲理论太枯燥了,上个栗子。
需求:生成一个1至100,步长为5的数组。
a = seq(1,100,5)
a
[1] 1 6 11 16 21 26 31 36 41
[10] 46 51 56 61 66 71 76 81 86
[19] 91 96
2. 情景2:生成一个重复数列
R语言中实现生成重复序列的小函数名称为rep,为repeat的缩写,特别好记。但是重复序列包含两种情况:
情景2.1: 1,1,1,1,2,2,2,2
情景2.2: 1,2,3,1,2,3
那么,rep里的函数如何设置参数才能完成以上两种数列的生成目标呢?
2.1 生成一个1,2,3,1,2,3类似的数列
rep函数中b为需要复制的数列,2为复制的次数,各位可以根据自己的需求进行调整,只要是整数就好。
b = c(1,2,3)
b_rep = rep(b,2)
b_rep
[1] 1 2 3 1 2 3
2.2 生成一个1,1,1,2,2,2,3,3,3的数列
rep函数中c为需要复制的数列,eacg为数列中每个元素需要被连续复制的次数,各位可以根据自己的需求进行调整,只要是整数就好。
c = c(1,2,3)
c_rep = rep(c, each = 3)
c_rep
[1] 1 1 1 2 2 2 3 3 3
3. 情景3:生成一个给定范围及大小的随机数列
R语言中生成一个给定范围及大小的随机数列使用的是runif这个函数,这个我们之前有用过。这块再做一总结:
runif(length, low_limit, high_limit)
- length: 生成目标数组的长度
- low_limit: 生成目标数组的下界
- high_limit: 生成目标数组的上界
给大家举个栗子,随机生成一个长度为20,下界为-10,上界为10的数组:
d = runif(20, -10,10)
d
[1] 5.7400605 3.3614888
[3] 6.0453652 -5.5522004
[5] -6.2605447 8.3907748
[7] -9.2792736 0.9046413
[9] 4.2003175 4.8281140
[11] 0.1434386 9.2114844
[13] -4.1256033 -1.5977104
[15] 6.4439050 -3.2071489
[17] -8.0257372 -0.0238462
[19] 0.5533586 5.9334686
当然,由于runif() 函数为随机生成函数,每一次运行后生成的数列的值都是不一样的。
4. 情景4:生成一个给定大小的正态分布的数列
R语言中生成随机序列与生成正态数列的函数长得比较像:
rnorm(n, mean = 0, sd = 1)
其中:
- n: 生成目标数列的长度
- mean: 生成数列服从的正态分布的均值
- sd:生成数列服从的正态分布的标准差
实践以下,生成一个均值为10,标准差为2,长度为20的一个正态数组。那么问题来了,它跟runif长得很像,重复运行后输出的数列的结果会一致吗?我们来试下~
e = rnorm(20, mean = 10, sd = 2)
e
[1] 9.353797 10.197699
[3] 7.517421 12.750466
[5] 5.330487 8.391239
[7] 9.823847 7.564822
[9] 10.309636 11.147118
[11] 10.777385 12.225199
[13] 8.971717 11.007456
[15] 7.540044 6.638591
[17] 6.936127 13.021617
[19] 9.497354 9.592865
e2 =rnorm(20, mean = 10, sd = 2)
[1] 10.713801 7.166222
[3] 9.850157 10.894747
[5] 9.497140 9.178578
[7] 9.810915 9.693150
[9] 9.476625 10.661446
[11] 10.555617 9.410788
[13] 11.541646 7.568738
[15] 8.457985 15.385666
[17] 12.119783 10.065007
[19] 11.219981 11.942194
print(sum(e-e2))
[1] -16.6153
由上,我们可以看出两个数列的差值的和不为0,即rnorm每重复运行一次,即使都服从正态分布,但生成的数列大小是不一样的。那么,下边我们来看下e和e2两个数列的分布情况(图1),可视化代码如下:
df = data.frame(
index = 1:20,
e = e,
e2 = e2
)
dfm = melt(df,'index')
p1 = ggplot(data = dfm,
aes(value,fill = variable))+
geom_density(alpha = 0.5)+
scale_fill_brewer(palette = 'Spectral')+
geom_vline(aes(xintercept = 10),color = 'black',
size = 0.5,linetype = 'dashed')+
theme_bw()
png('plot1.png',
height = 12,
width = 15,
units = 'cm',
res = 800)
print(p1)
dev.off()
图1 数组e与e2构成的分布比较图
5. 总结
本篇主要解决了以下问题:
- 如何在R中生成等差数列?
- 如何在R中生成重复数列?
- 如何在R中随机生成给定长度及大小数列?
- 如何在R中随机生成服从一定均值一定标准差正太分布的给定长度的数列?
6. 本篇所用的R-packages(没有的需要用install.packages()进行安装)
library(reshape2)
library(ggplot2)
7. 致谢
首先,感谢大家的持续关注,小编会继续努力,持续更新下去的!
大家如果觉得有帮助啊,还麻烦大家关注点赞,也可以扩散到朋友圈,多多引导朋友加入咱们这个技术平台, 代码共享推动科研进程, 多谢大家啦~
大家如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~
祝大家身体健康,多多保重!!
Jersey 小编联系方式
8. 号外!TheWhoOPs平台与全国地研联公众号实现线上战略合作
这是与全国地研联联合推出的第六篇R语言技术推文-基础篇。
从2020年2月10日起,TheWhoOPs技术公众号将与全国地理学研究生联合会公众号(简称地研联)公众号实现全面线上合作。
合作内容主要包括为周一,三的R语言数据数据分析及可视化文章的线上共享发布及每周日的b站技术直播讲解(点击进入直播间)。上周直播视频已上传,想回看的小伙伴可以在我b站账号下查看哈~
如果大家觉得有帮助还劳烦多多帮忙宣传下哈!!
网友评论