如题,有一个数据框,想对每行数据进行累加,我写的代码是:

K=NULL
for (i in 1:nrow(data)) {
  K=list(K,cumsum(as.numeric(data[i,])))
}

<sup>Created on 2019-05-23 by the reprex package (v0.2.1)</sup>

  • Hoas 回复了此帖

    lilya

    library(tidyverse)
    
    mtcars %>% as.data.frame %>% apply(1, cumsum) %>% t
    #>                      mpg  cyl  disp    hp   drat      wt    qsec      vs
    #> Mazda RX4           21.0 27.0 187.0 297.0 300.90 303.520 319.980 319.980
    #> Mazda RX4 Wag       21.0 27.0 187.0 297.0 300.90 303.775 320.795 320.795
    #> Datsun 710          22.8 26.8 134.8 227.8 231.65 233.970 252.580 253.580
    #> Hornet 4 Drive      21.4 27.4 285.4 395.4 398.48 401.695 421.135 422.135
    #> Hornet Sportabout   18.7 26.7 386.7 561.7 564.85 568.290 585.310 585.310
    #> Valiant             18.1 24.1 249.1 354.1 356.86 360.320 380.540 381.540
    #> Duster 360          14.3 22.3 382.3 627.3 630.51 634.080 649.920 649.920
    #> Merc 240D           24.4 28.4 175.1 237.1 240.79 243.980 263.980 264.980
    #> Merc 230            22.8 26.8 167.6 262.6 266.52 269.670 292.570 293.570
    #> Merc 280            19.2 25.2 192.8 315.8 319.72 323.160 341.460 342.460
    #> Merc 280C           17.8 23.8 191.4 314.4 318.32 321.760 340.660 341.660
    #> Merc 450SE          16.4 24.4 300.2 480.2 483.27 487.340 504.740 504.740
    #> Merc 450SL          17.3 25.3 301.1 481.1 484.17 487.900 505.500 505.500
    #> Merc 450SLC         15.2 23.2 299.0 479.0 482.07 485.850 503.850 503.850
    #> Cadillac Fleetwood  10.4 18.4 490.4 695.4 698.33 703.580 721.560 721.560
    #> Lincoln Continental 10.4 18.4 478.4 693.4 696.40 701.824 719.644 719.644
    #> Chrysler Imperial   14.7 22.7 462.7 692.7 695.93 701.275 718.695 718.695
    #> Fiat 128            32.4 36.4 115.1 181.1 185.18 187.380 206.850 207.850
    #> Honda Civic         30.4 34.4 110.1 162.1 167.03 168.645 187.165 188.165
    #> Toyota Corolla      33.9 37.9 109.0 174.0 178.22 180.055 199.955 200.955
    #> Toyota Corona       21.5 25.5 145.6 242.6 246.30 248.765 268.775 269.775
    #> Dodge Challenger    15.5 23.5 341.5 491.5 494.26 497.780 514.650 514.650
    #> AMC Javelin         15.2 23.2 327.2 477.2 480.35 483.785 501.085 501.085
    #> Camaro Z28          13.3 21.3 371.3 616.3 620.03 623.870 639.280 639.280
    #> Pontiac Firebird    19.2 27.2 427.2 602.2 605.28 609.125 626.175 626.175
    #> Fiat X1-9           27.3 31.3 110.3 176.3 180.38 182.315 201.215 202.215
    #> Porsche 914-2       26.0 30.0 150.3 241.3 245.73 247.870 264.570 264.570
    #> Lotus Europa        30.4 34.4 129.5 242.5 246.27 247.783 264.683 265.683
    #> Ford Pantera L      15.8 23.8 374.8 638.8 643.02 646.190 660.690 660.690
    #> Ferrari Dino        19.7 25.7 170.7 345.7 349.32 352.090 367.590 367.590
    #> Maserati Bora       15.0 23.0 324.0 659.0 662.54 666.110 680.710 680.710
    #> Volvo 142E          21.4 25.4 146.4 255.4 259.51 262.290 280.890 281.890
    #>                          am    gear    carb
    #> Mazda RX4           320.980 324.980 328.980
    #> Mazda RX4 Wag       321.795 325.795 329.795
    #> Datsun 710          254.580 258.580 259.580
    #> Hornet 4 Drive      422.135 425.135 426.135
    #> Hornet Sportabout   585.310 588.310 590.310
    #> Valiant             381.540 384.540 385.540
    #> Duster 360          649.920 652.920 656.920
    #> Merc 240D           264.980 268.980 270.980
    #> Merc 230            293.570 297.570 299.570
    #> Merc 280            342.460 346.460 350.460
    #> Merc 280C           341.660 345.660 349.660
    #> Merc 450SE          504.740 507.740 510.740
    #> Merc 450SL          505.500 508.500 511.500
    #> Merc 450SLC         503.850 506.850 509.850
    #> Cadillac Fleetwood  721.560 724.560 728.560
    #> Lincoln Continental 719.644 722.644 726.644
    #> Chrysler Imperial   718.695 721.695 725.695
    #> Fiat 128            208.850 212.850 213.850
    #> Honda Civic         189.165 193.165 195.165
    #> Toyota Corolla      201.955 205.955 206.955
    #> Toyota Corona       269.775 272.775 273.775
    #> Dodge Challenger    514.650 517.650 519.650
    #> AMC Javelin         501.085 504.085 506.085
    #> Camaro Z28          639.280 642.280 646.280
    #> Pontiac Firebird    626.175 629.175 631.175
    #> Fiat X1-9           203.215 207.215 208.215
    #> Porsche 914-2       265.570 270.570 272.570
    #> Lotus Europa        266.683 271.683 273.683
    #> Ford Pantera L      661.690 666.690 670.690
    #> Ferrari Dino        368.590 373.590 379.590
    #> Maserati Bora       681.710 686.710 694.710
    #> Volvo 142E          282.890 286.890 288.890

    <sup>Created on 2019-05-23 by the reprex package (v0.2.1)</sup>

      Hoas 我的天,我怎么没想到,蠢得死了我,谢谢谢谢

      tctcab
      tidyverse 是加载管道函数,as.data.frame是由于题主声明为一个数据框。

      刚又发现 mtcars 本就是数据框,多虑了……

        用 base R 也行:

        df_temp=t(apply(mtcars, 1, cumsum) )
        df_temp
                             mpg  cyl  disp    hp   drat      wt    qsec      vs      am    gear    carb
        Mazda RX4           21.0 27.0 187.0 297.0 300.90 303.520 319.980 319.980 320.980 324.980 328.980
        Mazda RX4 Wag       21.0 27.0 187.0 297.0 300.90 303.775 320.795 320.795 321.795 325.795 329.795
        Datsun 710          22.8 26.8 134.8 227.8 231.65 233.970 252.580 253.580 254.580 258.580 259.580
        Hornet 4 Drive      21.4 27.4 285.4 395.4 398.48 401.695 421.135 422.135 422.135 425.135 426.135
        Hornet Sportabout   18.7 26.7 386.7 561.7 564.85 568.290 585.310 585.310 585.310 588.310 590.310
        Valiant             18.1 24.1 249.1 354.1 356.86 360.320 380.540 381.540 381.540 384.540 385.540
        Duster 360          14.3 22.3 382.3 627.3 630.51 634.080 649.920 649.920 649.920 652.920 656.920
        Merc 240D           24.4 28.4 175.1 237.1 240.79 243.980 263.980 264.980 264.980 268.980 270.980
        Merc 230            22.8 26.8 167.6 262.6 266.52 269.670 292.570 293.570 293.570 297.570 299.570
        Merc 280            19.2 25.2 192.8 315.8 319.72 323.160 341.460 342.460 342.460 346.460 350.460
        Merc 280C           17.8 23.8 191.4 314.4 318.32 321.760 340.660 341.660 341.660 345.660 349.660
        Merc 450SE          16.4 24.4 300.2 480.2 483.27 487.340 504.740 504.740 504.740 507.740 510.740
        Merc 450SL          17.3 25.3 301.1 481.1 484.17 487.900 505.500 505.500 505.500 508.500 511.500
        Merc 450SLC         15.2 23.2 299.0 479.0 482.07 485.850 503.850 503.850 503.850 506.850 509.850
        Cadillac Fleetwood  10.4 18.4 490.4 695.4 698.33 703.580 721.560 721.560 721.560 724.560 728.560
        Lincoln Continental 10.4 18.4 478.4 693.4 696.40 701.824 719.644 719.644 719.644 722.644 726.644
        Chrysler Imperial   14.7 22.7 462.7 692.7 695.93 701.275 718.695 718.695 718.695 721.695 725.695
        Fiat 128            32.4 36.4 115.1 181.1 185.18 187.380 206.850 207.850 208.850 212.850 213.850
        Honda Civic         30.4 34.4 110.1 162.1 167.03 168.645 187.165 188.165 189.165 193.165 195.165
        Toyota Corolla      33.9 37.9 109.0 174.0 178.22 180.055 199.955 200.955 201.955 205.955 206.955
        Toyota Corona       21.5 25.5 145.6 242.6 246.30 248.765 268.775 269.775 269.775 272.775 273.775
        Dodge Challenger    15.5 23.5 341.5 491.5 494.26 497.780 514.650 514.650 514.650 517.650 519.650
        AMC Javelin         15.2 23.2 327.2 477.2 480.35 483.785 501.085 501.085 501.085 504.085 506.085
        Camaro Z28          13.3 21.3 371.3 616.3 620.03 623.870 639.280 639.280 639.280 642.280 646.280
        Pontiac Firebird    19.2 27.2 427.2 602.2 605.28 609.125 626.175 626.175 626.175 629.175 631.175
        Fiat X1-9           27.3 31.3 110.3 176.3 180.38 182.315 201.215 202.215 203.215 207.215 208.215
        Porsche 914-2       26.0 30.0 150.3 241.3 245.73 247.870 264.570 264.570 265.570 270.570 272.570
        Lotus Europa        30.4 34.4 129.5 242.5 246.27 247.783 264.683 265.683 266.683 271.683 273.683
        Ford Pantera L      15.8 23.8 374.8 638.8 643.02 646.190 660.690 660.690 661.690 666.690 670.690
        Ferrari Dino        19.7 25.7 170.7 345.7 349.32 352.090 367.590 367.590 368.590 373.590 379.590
        Maserati Bora       15.0 23.0 324.0 659.0 662.54 666.110 680.710 680.710 681.710 686.710 694.710
        Volvo 142E          21.4 25.4 146.4 255.4 259.51 262.290 280.890 281.890 282.890 286.890 288.890

          Hoas 加载 tidyverse 这个包会加载一大堆(这里的量词我很想用“坨”)跟这里的任务毫无关系的包,而且这个加载是 attach() 式的而不是 loadNamespace() 式的(即:暴露包内所有导出的对象),所以会严重污染用户的工作空间。只是为了一个管道操作符的话,加载 magrittr 就可以了。其实我是非常希望 magrittr 整个包只有 %>% 这么一个导出对象,因为这个对象被使用的频率应该远超过这个包里其它对象,用户加载起来不用加载进一堆用不着的对象。

          在我看来,tidyverse 这个 R 包只该有一个用途,就是 install.packages('tidyverse') 时自动把极乐净土的众神都请下来。在这之后,该求哪个神仙就 library() 哪个,而不要每次都把玉皇大帝、二郎神、西天如来、东海龙王、牛魔王、阎王爷、灶王爷、黑白无常、蜘蛛精、九尾妖狐等一堆神仙鬼怪摆上香案。

          嗯,我洁癖:若无必要,勿扰工作空间。

            yihui 哈哈,其实我也有点洁癖,这样用的原因之一是自己对工作空间的了解没有那么深,现在看来我洁癖的空间又扩充了……

              yihui Hoas Jiena tctcab

              最近我向人推荐使用 Base R 去做数据操作,Base R 总共就那么 10 来个函数做这个事,干嘛要把这个数据操作的问题扩充到 10 来个不是自己维护的 R 包,里面的魔法太多了,根本记不住,出错了也难以兜住,而且作者也在不断的更新里面的函数,甚至重新设计。

              1. Base R 内10来个函数指的是:

                1. reshape 将长的数据框变形为宽的数据框
                2. transform 可以在原来的数据框上添加新的一列,这个新的列通常是根据已有的列加减乘除等计算而来
                3. subset 提取数据框中的某些列和行,也可以用 $[ 实现
                4. order 按照数据框的某(些)列排序,如先按照第一列从小到大排序,再按照第二列从小到大排序
                5. split 将数据框按照某个分类变量拆分为列表,后续常常可以接 lapply 实现分组计算
                6. merge 合并两个数据框 inner outer left 和 right 四种合并方式,和 SQL 中的 left_join 等操作如出一辙
                7. duplicated 查出是否有重复的记录,后续可以决定是否去掉
                8. complete.cases 查出是否有不完整的记录,后续考虑是否要去掉
                9. aggregate 聚合,这个就不解释了,大家都懂
                10. 最后再加上 Reducedo.callapply 真的够了,应付 90% 的数据操作应该没问题
              2. 作者最初造了 reshape 包(退休了),接着是 reshape2 (也退休了)然后是 plyr (还是退休了)现在是 purrr 大家猜猜下一个会是谁?

              3. 作者也比较 High 造 tidyr 包新搞了 gatherspread 猜猜这两个函数在干嘛? reshape ! 命名不直观大家都记不住,结果只好请大家来决定叫个啥名好 ,因为又有超级豪华版的 pivot table 等待大家 <https://t.co/cJ0GM1VZ1H>

              4. 我发现老有人用 by 函数来试图证明 Base R 的糟糕,因为它严重打破一致性,有那么多其它可用来操作的函数,我就想问他为啥要用这个?

              最近怼力有点足,大家见谅!

                Cloud2016 怼得爽,我喜欢。

                • str_length? nchar.
                • str_c? paste.
                • str_sub? substr.
                • str_to_lower? tolower.
                • str_split? strsplit.
                • str_detect? grep.
                • ...

                可以列很长。横跨好几个包。

                单从命名看,base R 确实一致性比较差。就说上面这几个,tidyverse 只需记一下 str_,然后用编辑器的自动补全功能就行了。如果先接触tidyverse,后接触 base R,那可能会觉得后者难记。有先入为主的因素吧。

                除了功能和结构外,作者可能很大程度上是对 base R 的函数名不满,然而又改不了,所以干脆重来一遍。透过奇怪的函数名,隐隐感觉到某种情绪,恨不得砸烂一个旧世界,重建一个新世界。就跟罗振宇发明了很多新名词一样,其实是老内容。

                tidyverse 最诱人的地方,还是哥哥画呃。

                  Cloud2016
                  极乐净土势力的好处是管道和参数一致性。能干的事情baseR也能干这也不假,同样的数据清理搞了很多新包我也觉得好麻烦啊。

                  还有ggplot2,这个名字里的2就很让人费解

                    tctcab Hadley 大人创意太多,而且每个创意都一不小心就太流行了,然后想来个大改动却发现已经刹不住车,只好另起炉灶。其实几年前险些就诞生了 ggplot3……又是一段 CRAN 黑历史斗争,不说了。

                    一致性确实是非常重要,但一致性的副作用是宗教倾向。领略到了一致性的美好,就会过度敌视不一致性,以为只有一致性才属于文明社会、才是文明人应该遵守的法则。我今年初的报告中借弗洛伊德的《文明及其缺憾》表达了我对期刊排版一致性的强烈不满:https://bit.ly/pagedown#39 文明的特征之一就是秩序(服从),但它会压制个性。

                    再次澄清一点:我支持极乐净土,我认为它的积极作用远大于毒副作用,我只是说没必要三句话不离管道,仿佛不管道、不成活一样。任何忍术都有其缺陷。

                      yihui

                      hadley大人很厉害,不过我也同意你的说法:将他偶像化并不好。

                      我现在算是极乐净土和基础R的混打选手, 极乐净土的包或者理念其实好多都还没深入用过,比如我毫不羞耻地承认至今没搞懂non-standard evaluation…

                        yihui 想起了上世纪初的文言和白话之争。有些人主张一切尽用白话,反对一切有古文气息的写法。鲁迅也宣传白话,反对古文,不过他说,例如:“林冲笑道:原来,你认得。”这样的表达也不必非要写成“原来,你认得。”林冲笑着说。

                        如何方便就如何处理,何必尾生抱柱,痛并难过着。有些东西跟瘟疫一样传播,比如 Base R 的一些缺点和极乐净土(与 pipe)的一些优点。人们往往没有思考就接受了,然后成为新的传播媒介。

                        我常用极乐净土的工具,但是看到 data %>% head() 这样的写法就仿佛看到了“林冲笑着说”。

                          Base R 的操作函数

                          • stats 包: reshape aggregate complete.cases
                          • base 包: transform subset order split merge duplicated Reduce do.call apply lapply

                          Base R 的函数非常简洁明了,上面提及的数据操作函数都在 stats 和 base 两个包里,再比如文件操作的系列函数 file.* dir.* sys.* 和字符串操作的系列函数 ?regex 也都在一两个 Base R 包里。它太丰富了,功能太全面了,可见 Base 是就其在 R 包的地位而言,这样做对初学者太不友好,查看一下 ls("package:base") 就会发现 1232 个涉及诸多方面的函数,极有可能当初设计的时候功能拆分没有到位,这些 Base R 的数据操作函数功能很强,文档看起来很枯燥,导致 tidyverse 有机可乘,将 reshape 函数拆成一个包,aggregate 函数在 dplyr 里拆成一段一段的,诸如此类。Python 不这么干,分成一系列子模块,功能分类做的比较好!这两种方式代表了不同的思维模式,萝卜白菜各有所爱。

                          至于说宗教信仰,可能信奉 Base R 的真有,官方主页和文档万年不变,开发一直在 SVN 上,可能就那么二三十号人维护源码,开源但没有充分利用开源的力量(这个要分析源码提交记录,看是不是几十年来主力一直没变,我记得在某个大佬的 slide 上分析过,但是我记不得了在哪了,哪位大侠有空帮忙找下,我看过之后一直搜不出来,slide 里面有图,配色方案是 hcl 分析提交记录使用了 XML 包和不少正则,分析的源代码在 Github 上开放的)

                          PS

                          刚才脑子一下子清澈了,马上搜出来了,是大佬 Roger Bivand , Slide 及其源码在 https://github.com/rsbivand/eRum18

                          • Hoas 回复了此帖

                            Liechi 你跟我想到一块去了(文言与白话),只不过我没说出来而已;可能是最近你提鲁迅比较多,而碰巧我这几个月也正好一直在看鲁迅的文集。

                            Liechi tctcab 我也是混打选手,但倾向于 Base R ,之前有 ggplot 但是庆幸我没赶上

                            dapengde 命名一致性是个问题,输入是一个数据框,输出是一个非数据框,这种不一致性更加糟糕,这也是 tidyverse 造 tibble 打通数据分析流的优势,也成就了大量的 broom broom.mixed broomExtra tidymodel 模型输出一致性的清理包。另外关于 Base R 和 stringr 的正则、字符串操作函数对比,这有份完整的,不必自己整理了 https://stringr.tidyverse.org/articles/from-base.html

                              Cloud2016 开源但没有充分利用开源的力量

                              这句话说得好,有些时候我也很纳闷为什么会有这么多功能重复的函数,为什么非要在 base 已有的基础上开发新的以及,为什么 R Core Team 不作适当的整合,像 tidyverse 一样分好类。可能这里存在着一些看不见摸不着的博弈吧……

                              我纳闷但是我不纠结,因为自己能用就行了,不需要多管哪个是哪个。

                                Hoas 既然已经知道 R Core Team 这么做,今后也不太可能做功能拆分和整合。所以 Base R 就是代指那些 R 包合集,相当于 tidyverse

                                Pkgs <- sapply(list.files(R.home("library")), function(x)
                                  packageDescription(pkg = x, fields = "Priority"))
                                names(Pkgs[Pkgs == "base" & !is.na(Pkgs)])
                                 [1] "base"      "compiler"  "datasets"  "graphics"  "grDevices" "grid"     
                                 [7] "methods"   "parallel"  "splines"   "stats"     "stats4"    "tcltk"    
                                [13] "tools"     "utils"