zoukankan      html  css  js  c++  java
  • R(7): data.table

      这个包让你可以更快地完成数据集的数据处理工作。放弃选取行或列子集的传统方法,用这个包进行数据处理。用最少的代码,你可以做最多的事。相比使用data.frame,data.table可以帮助你减少运算时间。一个数据表格包含三部分,即DT[i, j, by]。你可以理解为我们告诉R用i来选出行的子集,并计算通过by来分组的j。大多数时候,by是用于类别变量的。

    特点


    • data.table(DT)的操作语句类似于SQL,DT[i, j, by]中的i, j, by 对应着SQL语句的 i=where, j=select, by=group by。所以DT中的i, j并不是只是像data.frame只代表着行列,它更加的灵活多变
    • 符号 ” := “快速的增加或者删除列,类似SQL的update。
    • setkey(DT, colA, colB),可以使得检索和分组更加快速
    • order,快速多重排序, 例如对DT按照x,y进行排序DT[order(DT$x, -DT$y),]或者DT[with(DT, order(x, -y))

    示例


    安装及载入程序包

    install.packages("data.table")
    library(data.table)
    •  使用data.table的fread()函数,用下面的方式,快速直接读取航班数据
      flights <- fread("https://raw.githubusercontent.com/wiki/arunsrinivasan/flights/NYCflights14/flights14.csv")
    • 查看数据
      > mydata <- data.table(iris)
      > mydata
           Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
        1:          5.1         3.5          1.4         0.2    setosa
        2:          4.9         3.0          1.4         0.2    setosa
        3:          4.7         3.2          1.3         0.2    setosa
        4:          4.6         3.1          1.5         0.2    setosa
        5:          5.0         3.6          1.4         0.2    setosa
       ---                                                            
      146:          6.7         3.0          5.2         2.3 virginica
      147:          6.3         2.5          5.0         1.9 virginica
      148:          6.5         3.0          5.2         2.0 virginica
      149:          6.2         3.4          5.4         2.3 virginica
      150:          5.9         3.0          5.1         1.8 virginica
    •  条件选择
      > mydata[Species =="setosa" & Sepal.Length > 5.0 & Sepal.Width == 3.5,c("Sepal.Length","Sepal.Width","Species")]
         Sepal.Length Sepal.Width Species
      1:          5.1         3.5  setosa
      2:          5.1         3.5  setosa
      3:          5.2         3.5  setosa
      4:          5.5         3.5  setosa
    •  计算:.() 表示list
      > mydata[,sum(Sepal.Length,na.rm = TRUE)]
      [1] 876.5
      > mydata[,.(sum(Sepal.Length,na.rm = TRUE),sd(Sepal.Length),mean(Sepal.Length)),by=Species]
            Species    V1        V2    V3
      1:     setosa 250.3 0.3524897 5.006
      2: versicolor 296.8 0.5161711 5.936
      3:  virginica 329.4 0.6358796 6.588

    上面的函数等价于:

    mydata[,list(V1=sum(Sepal.Length,na.rm = TRUE),
                 V2=sd(Sepal.Length),
                 V3=mean(Sepal.Length)),
       by=.(Species)]
    •  函数
      mydata[,{
        print(Sepal.Length)
        plot(Sepal.Width)
      }]
    •  setkey

      setkey(mydata,Species)
      mydata["setosa"]
      mydata[c("setosa","virginica")]
    •  排序

      > mydata[order(Sepal.Length,-Sepal.Width)]
           Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
        1:          4.3         3.0          1.1         0.1    setosa
        2:          4.4         3.2          1.3         0.2    setosa
        3:          4.4         3.0          1.3         0.2    setosa
        4:          4.4         2.9          1.4         0.2    setosa
        5:          4.5         2.3          1.3         0.3    setosa
       ---                                                            
      146:          7.7         3.8          6.7         2.2 virginica
      147:          7.7         3.0          6.1         2.3 virginica
      148:          7.7         2.8          6.7         2.0 virginica
      149:          7.7         2.6          6.9         2.3 virginica
      150:          7.9         3.8          6.4         2.0 virginica
    • 特别的符号 .N 是一个内建的变量,它表示当前的分组中,对象的数目
      > mydata[Species =="setosa" & Sepal.Length > 5.0 & Sepal.Width == 3.5,.N]
      [1] 4
    •  如何获取每个机场起飞的航班数

      > flights[, .(.N), by=.(origin)]
         origin     N
      1:    JFK 81483
      2:    LGA 84433
      3:    EWR 87400
    • 当参数j和by里面只有一列,我们可以省略 .(),如:ans <- flights[, .N, by=origin]

    •  如何获取美航在所有机场的起/降的数目
      > ans <- flights[carrier == "AA", .N, by=.(origin,dest)]
      > head(ans)
         origin dest    N
      1:    JFK  LAX 3387
      2:    LGA  PBI  245
      3:    EWR  LAX   62
      4:    JFK  MIA 1876
      5:    JFK  SEA  298
      6:    EWR  MIA  848
    • 如何获取美航在所有机场的起/降的平均延误时间
      > flights[carrier == "AA", 
      +         .(mean(arr_delay), mean(dep_delay)), 
      +         by=.(origin, dest, month)]
           origin dest month         V1         V2
        1:    JFK  LAX     1   6.590361 14.2289157
        2:    LGA  PBI     1  -7.758621  0.3103448
        3:    EWR  LAX     1   1.366667  7.5000000
        4:    JFK  MIA     1  15.720670 18.7430168
        5:    JFK  SEA     1  14.357143 30.7500000
       ---                                        
      196:    LGA  MIA    10  -6.251799 -1.4208633
      197:    JFK  MIA    10  -1.880184  6.6774194
      198:    EWR  PHX    10  -3.032258 -4.2903226
      199:    JFK  MCO    10 -10.048387 -1.6129032
      200:    JFK  DCA    10  16.483871 15.5161290
  • 相关阅读:
    C#多线程编程实战(一):线程基础
    查找算法之顺序查找
    设计模式01 创建型模式
    查找算法之二分查找
    设计模式01 创建型模式
    每天学一个,设计模式概要
    设计模式 01
    汽车电子传感器科普:激光雷达 毫米波雷达 超声波雷达
    C 如何判断编译器是否支持C90 C99?
    Node.js之EventEmiter
  • 原文地址:https://www.cnblogs.com/tgzhu/p/6773897.html
Copyright © 2011-2022 走看看