R语言数据实战 | 十行代码实现sample函数谱曲
大家好,我是水妈。今天借雪姨的宝地,介绍一个R语言函数,sample。
跟着水哥学了大半年的钢琴,最近突发奇想:用编程软件生成个简单的小乐谱,弹一下会是什么样子?于是有了今天的推文。
前阵子水哥学了个乐理知识,是C大调的主和弦和属和弦。如果一个小节do,mi,sol居多,左手就配主和弦;如果re,fa,sol居多,左手就配属和弦。先记住这个乐理知识。
再来看看R语言里面的sample函数。sample函数是用来抽样的,可以是有放回也可以是无放回,还能指定样本的入样概率。比如我的班上有5个学生,每个学生分配了1个编号,从1到5。我上课的时候要抽2个学生回答一个问题。可以这样做:
先不管第一行代码。第二行的replace = T是指有放回的抽样,非常倒霉的2号同学被我抽到了2次。第三行是指无放回抽样,分别抽到了3和4号同学。如果你直接运行这两行代码,得到的结果大概率跟我的不同。那么,第一行代码就起到了结果可重复的作用:固定随机种子。如果先运行第一行代码,再运行第二和第三行,你的结果就会跟我的相同了。在撰写论文进行随机模拟,团队做项目等过程中,都要注意固定随机种子,保证结果可重复。
如果我特别看重3号学生,想让他多回答几个问题,可以设置每个样本的入样概率。这些概率加和必须等于1。通过下面这段代码我们可以使不同同学的入样概率不同:点名30次,设置3号同学被点到的概率为0.6,其他同学是0.1。30次点名之后发现3号同学被点名17次,占比56.7%。
介绍完了sample函数,下面要生成我的简单乐谱了。代码如下:
I代表主和弦,我希望do,mi,sol多一些,所以概率设置的时候做了调整;同理,V代表属和弦,我希望re,fa,sol多些。这里为了穿插生成主和弦和属和弦的音符,我定义了一个叫做music的函数,需要给出音符数和和弦的选项。最后我生成了20个小节,主→属→主,这么个安排。输出一下结果看看。
光说不练不行,以下是我的弹奏。请忽略我的演奏水平和渣录音。
熊粉们可以尝试更加复杂的编曲实验,比如融入更多音符、节拍等。之所以没有弄的更复杂,是因为我真的只能弹成这样。期待你们的尝试。