• R语言已解决
  • 【已解决】对数据框中满足某些条件的数据的重写

tctcab Liechi Hoas 我突然发现我好像已经看不懂各位的代码了,我提供一个基于 Base R 的方案,我自认为我的代码可读性强的多,也更加简洁,为了以示区别我这里新添加一列 new_cyl,在这里你完全可以继续使用列名cyl

transform(mtcars[2:5,], new_cyl = ifelse(cyl < 6,2,cyl))
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb new_cyl
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4       6
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1       2
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1       6
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2       8

希望大家不要动不动就跳极乐净土 <https://github.com/matloff/TidyverseSkeptic>

至于可维护性和稳定性,咱们不妨定个五年或十年之约,看看谁的代码还能不经改动照样运行?我想我会完胜 😂

    tctcab 原来如此!我一直觉得极乐净土的工具不适合按位置选行来操作,不过这也是个办法;写成 1:length(mtcars$cyl) %in% 2:5应该也行。

    先前看到了 row_number 这个函数,不过一看说明书,上边赫然写着 row_number(): equivalent to rank(ties.method = "first")。这命名把我惊到了,于是未敢深究其详(现在知道了这好像是从 SQL 里借过来的名字)。

    有一点我不大明白,我把你代码里的 row_number() 换成 rank(ties.method = "first") 就不工作了。不知道这里的 row_number() 接受了管道递送过来的哪个数据?

    dapengde Cloud2016 我昨天刚写了一篇中文日志分析净土问题(唉,真是太复杂了,交战双方都有些失去理智)。待我把下一个 R 包整好了推上 CRAN 就来集中发布我这半年的日志。

      我觉得这里用 dplyr “不太直接”的原因是“行2到5”这个条件。我的第一反应是先 mutate 一个变量 index 表示行数,再用 ifelse 给 “cyl_new” 赋值,conditional on “index” 和 “cyl” 。

      Cloud2016 Hadley 大人开始帮 data.table 做网站搞推广了。以后 R 史家不知是否会引这条 issue,并注:从此,R 界虽依旧兄弟睨于墙,但外御欺辱了。

        Liechi
        好事!tidyverse系列的网站做得都比较好,都有非常好的示例可学,而data.table个人觉得虽然简洁但是没有那么直接,有些费脑筋,希望这次合作可以承袭tidyverse系列网站的作风,给 R 用户更多的选择和权衡。

        Liechi

        其实hadley大人做了个实验性的dtplyr作为data.table的前端,干的事情是将dplyr的语法翻译到data.table,不过readme里写的也是心酸:都木有什么人用…

        This is a large change that breaks all existing uses of dtplyr. But frankly, dtplyr was pretty useless before because it did such a bad job of generating data.table code. Fortunately few people used it, so a major overhaul possible.

        我个人的理解是dplyr的性能应付日常操作足够了,真正在乎性能的用户都喜欢折腾,学个data.table也不是啥难事吧

        21 天 后

        Liechi data.table是不是有更简单的写法

        library(data.table)
        df <- as.data.table(mtcars)
        df[2:5,cyl:=.(ifelse(cyl<6,2,cyl))]
        1 年 后

        一年后,我用上了 data.table,写在这里给自己当做笔记,这是一个添加旬并且根据平闰年修改旬的日天数的代码:

        time_seq <- qxun_sby[, c(1:3, 5)] %>% 
          .[, days := rep(c(10, 10, 11, 10, 10, 10, 10, 10, 11, 10, 10, 11, 10, 10, 10, 10, 10, 11, 
                            10, 10, 10, 10, 10, 11, 10, 10, 11, 10, 10, 8, 10, 10, 11, 10, 10, 10),
                          times = iter / 36)] %>% 
          .[((y %% 100 == 0 & y %% 400 == 0) | (y %% 4 == 0 & y %% 100 != 0)) & t == 30, days := 9]