继续学R:List(列表) Part 1, 创建列表&命名&访问

粗略了浏览了一些各种R相关的文章,才惊觉R含金量最高的部分是统计分析部分,那部分我是一点不懂啊,所以真怀疑我能否坚持下去,姑且走着瞧吧,哪天写不下去了烂尾了,那也是意料之中的事情。

之前学了多元素向量,分三个小节学习了多元素向量的创建、访问以及操作。这篇文章我们来了解一下另外一种复杂的数据类型List/列表

创建列表

与多元素向量/Vertors不同,list可以同时容纳多种类型的元素。我们可以使用list()来创建list,示例如下:

mylist<-list('a', 5.2, c(7, 8, 9), 3+4i)
print(class(mylist))
print(mylist)

通过示例可见,不同于vertors的类型取决于其内元素的类型,而list有自己的类型list;另外不同于vertors只能包含相同类型的原子向量(不同类型会进行转换), list可以同时容纳多种类型的元素

命名列表元素

我们可以通过names()来给列表元素命名。示例如下:

mylist<-list('a', 5.2, c(7, 8, 9), 3+4i)
names(mylist)<-c('char', 'number', 'vertors', 'complex')
print(mylist)

访问列表元素

下标访问

通过下标访问,和通过下标访问多元素向量类似,例如:

mylist<-list('a', 5.2, c(7, 8, 9), 3+4i)
print(mylist[2])
print(mylist[c(1,2)])
print(mylist[c(TRUE, FALSE, TRUE, FALSE)])
print(mylist[c(-1,-2)])

命名访问

我们之前给list元素创建了名字,那么名字仅仅为了好看吗?答案是否定的,名字还可以用访问列表元素哦,例如:

mylist<-list('a', 5.2, c(7, 8, 9), 3+4i)
names(mylist)<-c('char', 'number', 'vertors', 'complex')
print(mylist$vertors)
print(mylist$number)


是不是很神奇?

vertors 命名访问

说到列表的命名访问,我不禁有一个疑问,vertors是否可以这样操作呢?光想没用,试试看:

v<-c(1, 2, 3, 4)
names(v)<-c('a', 'b', 'c', 'd')
print(v)
print(v['b'])


貌似可行呢?

重复命名

写到这,不禁又想一个问题,既然是对元素命名,那么命名应该是独一无二的,那么如果我们传入重复的命名会是如何呢?

v<-c(1, 2, 3, 4)
names(v)<-c('a', 'c', 'c', 'd')
mylist<-list('a', 5.2, c(7, 8, 9), 3+4i)
names(mylist)<-c('char', 'char', 'vertors', 'complex')

竟然都没有执行出错,那么访问命名元素时指向的到底是哪个元素呢?这个当课后题留给大家吧。说实话,可以给不同元素起相同命名,貌似有点坑啊。😳


今天就水到这里了,下期继续水。

相关链接


This page is synchronized from the post: 继续学R:List(列表) Part 1, 创建列表&命名&访问

保险保什么

今天一刷微信,一个朋友群里几百条信息,平时是没这么热闹的,看了一下一堆图片一堆视频,聊的是我们附近一个小区发生了煤气爆炸,然后引发了大火,造成至少3人以上死亡(说96144抬走三个人)。


(图源 :pixabay)

然后又从煤气爆炸聊到燃气保险,其中几个朋友一直在群里劝大家,燃气保险一定要买啊,每年才20元,买了才能保障生命和财产安全云云。

其实我并不反对买什么燃气保险,每年抄表员推销保险的时候我都痛快地交了钱,一则20元并不多,二则受不了抄表员磨叽。今年抄表员推销保险时隔壁邻居拒绝购买,然后抄表员说已经好几家没买保险然后爆炸了伤亡惨重等等。隔壁邻居也够坚决,告诉抄表员,出事我自己负责。

我打心底讨厌抄表员推销保险的话语,买不买保险和发不发生爆炸有什么必然关系吗?听她的语气,不买保险爆炸的概率就会高了很多一样,真是让人讨厌。我的邻居估计也被她气到了。

不过说到保险,我就想起我以前玩的超级玛丽啊、坦克大决战啊之类的游戏,里边有些特殊道具一旦得到,游戏人物就处于无敌的状态,什么各种攻击、子弹啊啥的统统无效,我和小伙伴们当时把这个特殊的道具起名叫做保险。


(图源 :pixabay)

而长大以后我们就会接触到各式各样的保险,比如说公司都要交的失业保险、医疗保险、养老保险;汽车啥的有车损险、盗抢险、第三者责任险;出去旅游啥的有意外伤害险;其它的商业的还有重大疾病险以及人寿险等等。

但是我们仔细一想,发现这些保险和我们小时候游戏里的保险完全是两个概念,游戏里保险加上知乎就是无敌的状态,啥也不怕了。而生活中的这些保险,失业险没法保证你不失业,养老险没法保证你不老甚至没法保证你活到老,医疗和重大疾病险保不了你不生病,意外伤害以及人寿险保不了你不出意外甚至不牺牲……

当然了,这些保险肯定不是一无是处,失业险当你失业了会给你一丁点补偿,养老险你要是能挨过65岁那么就可以领养老金,医疗和重疾险一旦你生病了会帮你出点医疗费,意外伤害和人寿险啥的一但你OVER了家人能得到一点补偿。

所以,保险还有有用的,有条件的该买还得买,另外有些保险貌似你不买都不行,给你的福利你不能不要。另外有时候全家的重担都挑肩上,所以买个意外险啥的也算给家人一份保障。


(图源 :pixabay)

但是就今天的爆炸事故而言,如果保了燃气险,那么事后会拿到一点补偿吧,但是燃气险真的保证不了不爆炸,所以平时建立起安全意识,做好各项检查才是重中之重啊。不然,拿的那些补偿能换回这三条人命吗?


This page is synchronized from the post: 保险保什么

继续学R:Vector(向量) Part 3, 多元素向量的操作(算术操作&排序)

在之前的两篇文章中,我们学习了多元素向量的创建以及多元素向量的访问,通过这两篇文章我们已经对多元素向量有了个基本的了解,接下来我们一起来看看多元素向量都如何操作。

算术操作

相同长度的两组多元素向量,可以进行加、减、乘、除操作。

v1<-c(1,2,3,4)
v2<-c(5,6,7,8)
print(v1+v2); print(v1-v2); print(v1*v2); print(v1/v2);


通过结果我们不难看出,加、减、乘、除就是将对应位置的元素进行相应的操作。

到这不难想出几个问题:

  • 是否所有类型多元素向量都支持如此操作?
  • 不同类型的多元素向量是否可以如此操作?
  • 不同长度的多元素向量是否可以如此操作?

经过测试,问题1的答案是并非所有类型多元素向量都支持算术操作,数字类型的才可以; 问题2的答案是不同数字类型的之间可以操作。

对于这两个问题其实不难得出答案,因为既然算术操作就是将对应位置的元素进行操作,那么只有两个原子向量之间支持对应的算术操作才可以。比如在Python中我们可以使用:

print('a'+'b')

而在R中,我试着执行:

print('a'+'b')


所以在R中,对两个字符型数据进行加运算是行不通的,当然对于字符型多元素向量更是行不通喽。

向量元素循环利用(Vector Element Recycling)

在算术操作中,我们提出了三个问题,但是解决了两个,那么剩下的问题呢?这里我们就来说一下不同长度的多元素向量进行算术操作时如何处理,比如这段代码:

v1<-c(1,2,3,4)
v2<-c(5,6)
print(v1+v2)


答案是R把v2的元素循环利用,扩展到与v1相同长度。

很多中文教程把这个翻译成向量元素回收/Vector Element Recycling,但是我个人认为向量元素循环利用更贴切,不过翻译成啥无所谓了,总之就是这么回事啦。

但是问题又来了,以以下代码为例:

v1<-c(1,2,3,4)
v2<-c(5,6,7)
print(v1+v2)

这时候该如何把v2扩展成和v1相同长度呢?扩展成5,6,7,5,6,7又比v1长了,难道再去扩展v1?想想就很纠结。还是直接试一下吧:

答案是把短的扩展到和长的相同长度为止,然后给出个警告⚠

多元素向量排序

给多元素向量排序是很简单的事情,直接调用sort()函数即可,例如:

v1<-c(1,2,3,4,-10,200)
print(sort(v1))

当然了,还支持排序方向(递增,递减)

v1<-c(1,2,3,4,-10,200)
print(sort(v1, decreasing = TRUE))

除了数字类型,还支持字符以及其它类型,这里就不一一演示啦,感兴趣的朋友自己试试吧。


至此,多元素向量就了解的差不多了,下节争取接触新内容啦。今天就水到这里啦。

相关链接


This page is synchronized from the post: 继续学R:Vector(向量) Part 3, 多元素向量的操作(算术操作&排序)

竟然有人8000元就想买我的QQ号🐧

今天接到一个电话,听声音应该是一个中年男子,起初我以为是客户呢,很客气地和他打招呼,然后问他有什么事情吗?结果他问我:“你的这个QQ转手吗?”


(图源 :pixabay)

我楞了三秒才意识到他问的应该是我用于客户支持的QQ,也是我手头现有以及曾有的最好的QQ号。这个QQ号是1开头的6位QQ,而且不带4。曾经我倒是有个五位的号码比这个短,不过那个号五开头还带4,所以那个送人了,最好的自己留下了。

不过自从有了这个QQ号,麻烦就接踵而来。三天两头地有人加好友问我这个QQ号转手吗?因为这个QQ号上都是客户,之前当然从未想过转手,不过看这么多人问,我就想这个QQ咋的不值个十几二十万啊,于是我问过几个询价的,结果有的报3000,有的报5000,最多的一个不过抱了8800。

这报价让我无比郁闷,这么好的QQ号,竟然只值不到1W元?开什么玩笑啊,不说20万至少你给我10W,我肯定是不会卖的。于是以后再有加好友询价的我就统统都拒绝了。


(图源 :pixabay)

我不由得想起有一段时间每天都能收到邮件要买我的一个四位字母的域名,出价一路从20美元涨到100美元,可是我这些年养这个域名就花了不止100美元呀,我宁愿这个域名烂手里,也不能廉价甩卖啊。

说到养域名的费用,我想起来我这个QQ也没少花钱啊,之前的QQ会员到现在的超级会员这都是钱啊。刚刚看了一下年费超级会员2019-01-22到期,QQ会员2023-06-28到期,这我至少砸里3000以上人民币呀,那些给我报价3000的,让我情何以堪啊。

当然了,我续费会员/超级会员肯定不是为了什么会员身份以及尊贵红名显示或者成长值之类的,之所以要会员/超级会员,是因为可以建2000人的大群,只不过后来这个群大多都荒芜了。说到会员,想起一个冷笑话:

女友:
我们分手吧。
我:为什么?
女友:因为你是尊贵的QQ会员,我觉得配不上你。


(图源 :pixabay)

扯远了,话说倒是第一次接到电话要买QQ号的,于是我尝试问了一下,出多少钱啊?对方很诚恳的说,至少8000元吧,我一听直接回复:“不卖”,果断挂电话。不过他咋知道我电话呢?没准还真是我客户呢。

话说,8000元就想买我的QQ,作为尊贵的超级QQ会员,你觉得我会8000元卖掉我这么尊贵的身份吗?😀


This page is synchronized from the post: 竟然有人8000元就想买我的QQ号🐧

继续学R:Vector(向量) Part 2, 多元素向量访问 & 计算长度

在之前的文章中,我学习了《多元素向量创建&类型》,学到了用c()函数冒号操作符(:)seq()操作符等几种方式创建多元素向量访问,并且测试了多元素向量类型转换的优先级,得出raw > logical > integer >numeric >complex > character的结论。

这节我们来继续学习。

多元素向量访问

下标单元素

和很多语言一样,多元素向量中的元素是可以使用下标来访问的,举例如下:

v<-c('a', 'b', 'c', 'd', 'e', 'f');
print(v[1])

一个有意思的事就这个下标是从1开始计算的,这个和C语言以及Python语言中的习惯不太一致。

下标多元素

另外一个有意思的地方是,可以同时访问多个多个元素

v<-c('a', 'b', 'c', 'd', 'e', 'f');
print(v[c(1, 2, 3)])


是不是有些神奇?

逻辑开关

除了上述两种访问方式外,还有其它访问方式,比如说使用逻辑类型来控制显示开关

v<-c('a', 'b', 'c', 'd', 'e', 'f');
print(v[c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE)])


写到这里不禁有一个疑问,如果传递的开关量比元素个数少,剩下的该如何显示?经过测试,我发现找不出来啥规律,行为诡异啊。所以如果用到了,还是老老实实传递相同个数的开关量吧,要么等以后找到规律再说。

下标 0

R TutorialR - Vectors中,有这样一段示例:

# Accessing vector elements using 0/1 indexing.
t <- c("Sun","Mon","Tue","Wed","Thurs","Fri","Sat")
y <- t[c(0,0,0,0,0,0,1)]
print(y)

乍一看上边的示例,还以为是可以用0/1来做开关和TRUE/FALSE一样,实际上0/1并非开关量,还是下标,只是对于下标0而言,相当于空值。所以上述代码等价于:

t <- c("Sun","Mon","Tue","Wed","Thurs","Fri","Sat")
y <- t[c(1)]
print(y)

下标负数

还有一种方式就是下标传入负数

v<-c('a', 'b', 'c', 'd', 'e', 'f');
print(v[c(-2, -4)])


由此可见,负数相当于关掉对应位置的元素。

多元素向量长度

顺便考察了一下多元素向量长度如何计算,发现了一个length()函数,示例如下:

v<-c('a', 'b', 'c', 'd', 'e', 'f');
print(length(v))

好了,今天就水到这里了。

相关链接


This page is synchronized from the post: 继续学R:Vector(向量) Part 2, 多元素向量访问 & 计算长度

在山本清,入世皆幻

之前的帖子中曾提到过苏州的寒山寺:《读书:寒山问拾得 & 弥勒菩萨偈》,那么作为上有天堂下有苏杭和苏州并列的杭州怎么可能没有知名的寺院呢,对了杭州有个灵隐寺。


(图源 :pixabay)

但是我今天要讲的不是灵隐寺的故事,灵隐寺那有两个景点:飞来峰和冷泉亭。百度飞来峰,里边提到一个故事,说是灵隐寺的济公和尚算到有山峰要从天外飞来,然后抢了别人家的新娘就跑,大家都去追啊,然后山峰啪唧一下落在村庄里,济公的行动救了整个村子的人。

我听到另外一种说法是东晋年间一位天竺高僧云游到一片山清水秀之地,然后抬头看一下远山,说“哎呀,这山似曾相识啊,莫不是远在天竺的灵鹫山上的小岭,不知是何年飞来此间?佛在世日,多为仙灵所隐。”随从人员一听,哎呀,这山了不得啊,于是在这伐木建寺,取名灵隐寺。

总之这飞来峰啥时候飞来的,从哪飞来的,或者到底是不是飞来的,成了千古谜案。同样成谜的还有冷泉亭,或者吧,这个冷泉也没啥稀奇的,无论是地下水还是山泉,除了温泉以外,大都是很清凉的。不过明代有个大书画家董其昌来这溜达,溜达完之后还留下一幅对联:

泉自几时冷起?
峰从何处飞来?

大家一看,哎呦喂,这好机会得好好利用,没准就出名了呢?于是纷纷做对应答。

比如说:

泉自有时冷起,峰从无处飞来。
——俞樾

又比如:

泉自冷时冷起,峰从飞处飞来。
——俞樾妻

比如说:

在山本清, 泉自源头冷起;
入世皆幻, 峰从天外飞来。
——左宗棠

又比如:

泉水淡无心,冷暖惟主人翁自觉;
峰峦青未了,去来非佛弟子能言。
——金安清

我比较喜欢左宗棠的对联,在山本清,入世皆幻啊,既如此,何必又纠结于什么时候冷的,从哪里飞来的呢?

金安清的“冷暖惟主人翁自觉” 我也超喜欢,很多时候很多事,就像这泉水,别人说它冷暖清浊又如何呢?饮水的人因视角不同、心境不同,对他们自己而言得出什么结论就是什么结论。只有山泉自己怎么看自己才重要吧?但是山泉在意吗?


(图源 :pixabay)

我想狗尾续貂接两句,只是针对自己而言,没有亵渎这些文豪的意思

泉自几时冷起?冷暖自知。
峰从何处飞来?关你屁事。

呀,有些粗俗,影响我一贯以来伪装的良好形象,况且我研究这些有用没用的干啥呢,真是关你屁事,不如多写两行代码呢!还是删掉吧,嗯,已经删掉了,带着面具好累啊。还是高尔基的诗更贴近生活呀:

在苍茫的大海上,狂风卷集着乌云。
在乌云和大海之间,有一只海燕,你可长点心吧!

相关链接


This page is synchronized from the post: 在山本清,入世皆幻

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×