- 已编辑
在python里面可以这样
a = [1,100,5,-5,-7,99,-100]
先根据正负数,再根据绝对值进行排序
a.sort(key= lambda x: (x<0,abs(x)))
结果:
[1, 5, 99, 100, -5, -7, -100]
R里面如何实现呢?
a = c(1,100,5,-5,-7,99,-100)
目前想到的办法是正数负数拆开来,排序后再拼接一起,还是有一些麻烦
在python里面可以这样
a = [1,100,5,-5,-7,99,-100]
先根据正负数,再根据绝对值进行排序
a.sort(key= lambda x: (x<0,abs(x)))
结果:
[1, 5, 99, 100, -5, -7, -100]
R里面如何实现呢?
a = c(1,100,5,-5,-7,99,-100)
目前想到的办法是正数负数拆开来,排序后再拼接一起,还是有一些麻烦
拆开再拼接应该是这样:c(sort(a[a >= 0]), -sort(-a[a < 0]))
,感觉思路和可读性上差好多,python 的写法给我一种处理数据集时根据多个变量排序的感觉,写出来确实也比较像:tibble(a) %>% arrange(a < 0, abs(a)) %>% pull(a)
,但是还是借用了数据集对象而不是对变量直接排序
前排蹲一个 base R 的解法
好吧弄懂了,用order
即可
a[order(a<0,abs(a))]
frankzhang21 怎么想到用 order()
的,完全没想到可以这样
s609078902 借隔壁楼的帖子说几句:https://d.cosx.org/d/423062-frustration-one-year-with-r
我对 Tidyverse 的困惑之一就在于我不明白为什么它明明是全盘基于 base R 的,但在宣扬方面却总把 base R 妖魔化。因为它的宣传攻势如此猛烈,导致很多人认为一些简单的问题用 base R 一定无法或极难解决。怎么可能嘛——如果 A 是基于 B 构建出来的,那么 A 能解决的问题,B 一定能解决,只不过有时候用 B 可能没那么方便而已。Tidy 开发者能读懂 base、能用好它、能将它按自己的一套理念重新包装,那普通百姓就没这个能力?我个人对此是表示怀疑的。尽管我相信可能多数的普通百姓确实缺乏这个能力,但我觉得 Tidy 开发者对 base 的用刑过重、欠缺公平。我脑子里一直有个无法实施的虚拟试验,我在想,如果 R 核心开发团队里有一个哈神这样营销天才,base R 是否也不会被人觉得那么不堪。
回到你的问题:怎么能想到 order()
?如果你挖一下那个 dplyr::arrange()
函数,挖到底就会发现,dplyr:::arrange_rows
也会调用 order()
。base R 是个庞杂的工具箱,里面有很多灵活的基础工具,问题只是里面有一些坑,也欠缺宣传和教育,导致都被埋没了。base R 不对数据结构作假设,这是求灵活的代价,但也增加了学习难度;Tidy 对数据结构有一套假设,这会降低用户学习成本,对开发者来说有个假设之后开发也容易一点(就像数学假设越多,证明越容易证一样),但有时候就不可避免杀鸡只能用牛刀(因为它假设拖进来要杀的全都是牛,就算是一只鸡,你也得安上两只角给我装成一只小牛),就像二楼曲线救国先把向量转化为 tibble、再排序、再把这个向量抽回来。何苦要来回折腾这只小鸡。
base R 中排序基本就两个工具,一个是最容易想到的 sort()
,一个是不那么容易理解的 order()
(获取一个下标向量,可用它去索引得到排序后的值)。要是再挖一下,其实万法归宗,sort()
也是调用 order()
的,所以凡是谈到排序问题,宇宙的中心就是 order()
函数。认识到这一点后,天再也遮不住你眼,地再也埋不了你心,众数据皆明白你意,诸大神都烟消云散。
补充一个冷门小知识,直接在R的命令行里输入函数名,不要加括号,大概率你能看到函数源码,对于搞清楚操作细节非常方便。很多学科专用包基本就是基础函数加壳换皮,这种方法一下就能现原形。
看不到的可能是自定义了类型,这从软件工程上看更合理,不过想自定义就得去翻包里的源码了,很不幸 tidyverse 整个系列基本都属于这一类,开源黑箱化了属于是。
yihui 学了 tidyverse 后对 Base R 就不怎么研究了,对 order()
的了解也仅仅停留在很肤浅的阶段,现在感觉 Base R 是一个有待挖掘的宝藏,不知道有没有好的学习材料,还是说遇上了再积累
s609078902 作为水平不咋地的老菜鸟可以给你提个建议,你可以看看哈神的advance r 第一版,其实是挺好的资料,此外,关键是遇到问题,首先想想base r 怎么解决。
yihui
确实,学习 Tidy 的时候,感受到的是先默认需要操作的数据对象是一个数据框,这对于一个完全基于数据框结构的数据工作者来说,是非常方便的事情,可以很容易上手使用 Tidy 这套工具。可一旦使用场景不再局限于数据框,就会感到寸步难行。这一点让我联想到了 SAS,基础的处理对象是数据集,数据集内操作一切都好,一旦超出了数据集这个范围,就会变得很难办。哪怕是操作一个简单的向量,SAS 也会让人不自觉地把向量先放在数据集内,再进行后续的处理。
好在 R 中有 base R 这个工具箱,能够处理各种不同的数据结构。但是 base R 给我的感受是,当我看到一个问题的解答的时候,我能知道,“啊,原来这个问题可以靠这个工具解决”。而当我看到一个问题,想要找合适的工具的时候,望着硕大的工具箱,不知道该用其中的哪一个,或者不知道某个工具该如何使用,有一种无从下手的感受。
meeeeeeeeo 你遇到的这种情况应该是没有梳理导致的,我之前尝试梳理 Base R 的方方面面,比如字符串操作、正则表达式、基于 data.frame 的数据操作,基于 data.table 的数据操作,一些高频的数据操作,数据导入导出操作等。后来,没有太多时间持续迭代,导致有点烂尾了。内容详见《现代应用统计与 R 语言》
有这样一种体验:
当你来到某个圈子,看到一些问题,内心奇怪:为啥会这样呢,为啥有这些坑呢,为啥你们这些前辈就不能把他们先填平呢?不就是这点事儿嘛,不如自己捋起袖子来填吧!
一试,才知道为啥这些坑历久弥新了:前辈不是没填,而是经历了跟你一样的心路历程,最后发现,实在填不了啊!所以才是你看到的那个德性。
所以,自诩没有那个神力,不如坦然接受这个现实,只要解决手头的问题就开心。
Cloud2016 我也曾经梳理过以及正在梳理,但是已经放弃分享这个环节了。我觉得只有自己梳理的自己才用得上。别人梳理的,仍然很难变成自己的。不过这只是我的个人体验,不具备普遍性。
s609078902 order()
函数的帮助文件讲了怎么解决 tie 的问题。简单来说就是先按第一个对象排序;打平手的就按第二个排序;再打平手的按第三个...
yufree 我一般是光标在函数名上时按 F2 键,在 RStudio 左上栏显示函数的源代码。好处是可以在源代码里的某个函数名上继续 F2, 然后再继续,父父祖祖无穷匮。
Cloud2016 还是有人看的,比如我