• R语言
  • tidyverser包为何只能使用|>管道?且选取子集不全。

第一个问题:
iris 数据集,试图选择 species = setosa 的子集,
采用 tidyverse 包,
filter(d$Species=="setosa")

报错

Error in UseMethod("filter") :
no applicable method for 'filter' applied to an object of class "logical"

改成

d |>
+   filter(Species=="setosa")

可以运行,正确结果应该有 50 行,但运行出来只得到 25 行。

第二个问题:
iris 数据集,试图选择 species = setosa 或 virginica 的子集,

d |>
+   filter(Species== c('setosa','virginica')

结果只得到 13 行 setosa 和 13 行 virginica,仍然结果不全。

第三个问题:
iris 数据集,试图选择 species = setosa 或 virginica 的子集,
iris[iris$Species==c('setosa','virginica'),]
结果得到1/3/5/7……49行 setosa 和 102/104/106……150行 virginica。仍然不全

    hagiaatcos 如果你已经会 Base R 那套数据操作的工具,没必要花费心思去新学一套,把之前所学打磨得更深会更有价值,配合真实的数据,做数据操作,积累经验就更有意义了。

    第3个问题,应该这样

    iris[iris$Species %in% c('setosa','virginica'),]

      三个问题一起回复你。另外第二个问题你需要了解下循环补齐。

      dplyr::filter(iris, Species %in% c('setosa', 'virginica'))

      感谢楼上回复,学到了%n%. 作为初学者继续努力。

      Cloud2016
      我本来觉得在 tidyverse 的问题下面强推 base R 有党争之嫌疑,不过你的用语对新人来说十分温柔可亲,所以前面的嫌疑也淡化了。事实上是,对一个新人来说,网上随便搜的话得到专门介绍 base R 的文章偏少。好像 base R 的基础函数也是在更新的,我刚刚才知道原来 strrep 这个函数是16年诞生的。你说 base R 好,好在哪里你也可以举例,不过对新人来说,可能更想知道具体的好。

        yuanfan 真是新人的话不用了解那么多概况,把眼下的活干完收工。

          Cloud2016 看得人虎躯一震,不觉醍醐灌顶,话刚理不刚。好一番:银瓶乍破水浆迸,铁骑突出刀枪鸣。

          真的,赶紧干完活收工回家过年不香么,管它甚麽贝斯耳或贝斯手、泰迪厮或泰迪熊。

          yuanfan 你说 base R 好,好在哪里你也可以举例,不过对新人来说,可能更想知道具体的好。

          在这个问题里,若要说 Base R 有啥优势,大概就是这个 iris[iris$Species %in% c('setosa','virginica'), ] 的功能自盘古(Ross Ihaka & Robert Gentleman)开天辟地起就存在了,稳定性如钢铁,比楼上的钢铁还钢,永远值得信赖,无论是上午八点刚上班、下午六点快下班、或是凌晨三点加班,用方括号去索引以及用 %in% 查询子集,这两个功能都不会让你失望,你不必读推特、博客、成为谁谁或某厂的粉丝去不断追踪更新,因为它们就像基本国策百年不动摇。

          当然,这个方括号索引也有一个大坑,新手不留神会被坑到,这也是 Base R 的一大弊病,就是潜规则有点多,必须多开车上路多练才不容易翻车。方括号索引如果只是一行或一列,而且结果可以是纯纯的原子向量的话,那么 R 会把它化简为纯纯的向量,而丢弃原始数据结构(如矩阵或数据框)。如果需要保持原始数据结构,必须谨记 x[, , drop = FALSE]

          即使有大坑,这种大坑也是数十年不变的稳定大坑,老司机开到这里都知道松油门、点刹车,慢行绕过。这种“稳定性”有点讽刺(每次开车路过都会吐槽一句:特特么滴连坑都是稳定的),但和朝令夕改比起来哪个更糟糕,也不好说。

            yihui
            是不是我撒时候很强烈地跟益辉大神吐槽过湘云是钢铁直男之类的话啊,要不然就是我看湘云的文字时戴了滤镜。哈哈哈,其实在我看来湘云的话一点都不刚啊,就是很正常地不刚。

            我原话想说的新人本来应该是指初学者,但是湘云解读成职场新人也是可以的。当然啦,因为我最近很多时候想到的东西,都不敢全部说出来。其实我最初想到的是,看 baseR 与 tidyverse的拥护者各自相争,忽然明白了为何中国历史上既有清浊之争,就连清流内部也会有党争了。

              yuanfan 确实不刚,我有点开玩笑,只是觉得很有趣,我脑子里解读的画面是:憋说话,代码拿走,快跑完下班。

              至于党争,这些通常永远都不会有结果。这几年陆陆续续有人用定量试验对比了二者在教学中的效果,我早期关注的时候应该是没有确定性的结果说谁优谁劣的,后来不知道怎样了。好与不好,标准太多了,每个人也会给每个标准加上不同的权重,所以综合起来不大可能有一套系统能全面碾压另一套。具体问题上可以具体分析,宏观上没法一锤定音。

              yuanfan

              对一个新人来说,网上随便搜的话得到专门介绍 base R 的文章偏少。

              这个深有体会。我学 tidyverse 基本就是为了看懂网上搜索的结果,因为大部分都是 tidyverse 方案。

              现在懒得口舌之争,解决问题一般都是 base R + tidyverse 混合方案,哪个好用用哪个。比如虽然 base R 有 stack()unstack()这对至尊宝玉,我还是更喜欢 tidyr 的 gather()spread()这把紫青宝剑,虽然后者也被扫进了历史的垃圾堆。不过,lubridate 我始终欣赏不来,不如 strptime()format() 这对倚天剑和屠龙刀,再加上正则表达式这把玄铁重剑,处理日期时间所向披靡。