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

Hoas 更改标题为「【已解决】对数据框中满足某些条件的数据的重写

Hoas 以上两种办法基本上是等价的,属于 David Robinson 说的 "Someone new to R doesn’t need three ways to access a column in a data frame" 的三种方法中的两种。只是我写的省略了中间变量。

data.table 也比较简单:

library(data.table)
DT <- as.data.table(mtcars)
DT[DT[, .I %in% 2:5 & cyl < 20], cyl := 2]
DT

你这个例子我没有想到比较简洁的极乐净土办法,希望能请教一下极乐净土高手。

    Liechi

    可以是可以,不过这么写不如baseR的代码容易想到。所以还是安心做baseR和tidyverse混打选手吧。

    library(dplyr)
    mtcars %>%
      mutate(cyl = ifelse((row_number() %in% 2:5 &cyl < 6), 2, cyl)) %>%
      head()
    #>    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #> 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #> 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #> 3 22.8   2  108  93 3.85 2.320 18.61  1  1    4    1
    #> 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #> 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    #> 6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

      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))]