美文网首页
R语言tidyr包的使用

R语言tidyr包的使用

作者: 485b1aca799e | 来源:发表于2017-06-18 14:13 被阅读0次

    reshape2包的进化版—tidyr包

    tidyr包的作者是Hadley Wickham。这个包常跟dplyr结合使用。

    本文将演示tidyr包中下述四个函数的用法:

    gather—宽数据转为长数据。类似于reshape2包中的melt函数

    spread—长数据转为宽数据。类似于reshape2包中的cast函数

    unit—多列合并为一列

    separate—将一列分离为多列

    下面使用datasets包中的mtcars数据集做演示。

    library(tidyr)

    library(dplyr)

    head(mtcars)

    mpg cyl disp  hp drat    wt  qsec vs am gear carb

    Mazda RX4        21.0  6  160 110 3.90 2.620 16.46  0  1    4    4

    Mazda RX4 Wag    21.0  6  160 110 3.90 2.875 17.02  0  1    4    4

    Datsun 710        22.8  4  108  93 3.85 2.320 18.61  1  1    4    1

    Hornet 4 Drive    21.4  6  258 110 3.08 3.215 19.44  1  0    3    1

    Hornet Sportabout 18.7  8  360 175 3.15 3.440 17.02  0  0    3    2

    Valiant          18.1  6  225 105 2.76 3.460 20.22  1  0    3    1

    为方便处理,在数据集中增加一列car

    mtcars$car <- rownames(mtcars)

    mtcars <- mtcars[, c(12, 1:11)]

    gather

    gather的调用格式为:

    gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

    这里,...表示需要聚合的指定列。

    与reshape2包中的melt函数一样,得到如下结果:

    mtcarsNew <- mtcars %>% gather(attribute, value, -car)

    head(mtcarsNew)

    car attribute value

    1        Mazda RX4      mpg  21.0

    2    Mazda RX4 Wag      mpg  21.0

    3        Datsun 710      mpg  22.8

    4    Hornet 4 Drive      mpg  21.4

    5 Hornet Sportabout      mpg  18.7

    6          Valiant      mpg  18.1

    tail(mtcarsNew)

    car attribute value

    347  Porsche 914-2      carb    2

    348  Lotus Europa      carb    2

    349 Ford Pantera L      carb    4

    350  Ferrari Dino      carb    6

    351  Maserati Bora      carb    8

    352    Volvo 142E      carb    2

    如你所见,除了car列外,其余列聚合成两列,分别命名为attribute和value。

    tidyr很好的一点是可以只gather若干列而其他列保持不变。如果你想gather在map和gear之间的所有列而保持carb和car列不变,可以像下面这样做:

    mtcarsNew <- mtcars %>% gather(attribute, value, mpg:gear)

    head(mtcarsNew)

    car carb attribute value

    1        Mazda RX4    4      mpg  21.0

    2    Mazda RX4 Wag    4      mpg  21.0

    3        Datsun 710    1      mpg  22.8

    4    Hornet 4 Drive    1      mpg  21.4

    5 Hornet Sportabout    2      mpg  18.7

    6          Valiant    1      mpg  18.1

    spread

    spread的调用格式为:

    spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)

    与reshape2包中的cast函数一样,得到如下结果:

    mtcarsSpread <- mtcarsNew %>% spread(attribute, value)

    head(mtcarsSpread)

    car carb  mpg cyl disp  hp drat    wt  qsec vs am gear

    1        AMC Javelin    2 15.2  8  304 150 3.15 3.435 17.30  0  0    3

    2 Cadillac Fleetwood    4 10.4  8  472 205 2.93 5.250 17.98  0  0    3

    3        Camaro Z28    4 13.3  8  350 245 3.73 3.840 15.41  0  0    3

    4  Chrysler Imperial    4 14.7  8  440 230 3.23 5.345 17.42  0  0    3

    5        Datsun 710    1 22.8  4  108  93 3.85 2.320 18.61  1  1    4

    6  Dodge Challenger    2 15.5  8  318 150 2.76 3.520 16.87  0  0    3

    unite

    unite的调用格式如下:

    unite(data, col, ..., sep = "_", remove = TRUE)

    where ... represents the columns to unite and col represents the c

    这里,...表示需要合并的列,col表示合并后的列。

    我们先虚构一些数据:

    set.seed(1)

    date <- as.Date('2016-01-01') + 0:14

    hour <- sample(1:24, 15)

    min <- sample(1:60, 15)

    second <- sample(1:60, 15)

    event <- sample(letters, 15)

    data <- data.frame(date, hour, min, second, event)

    data

    date hour min second event

    1  2016-01-01    7  30    29    u

    2  2016-01-02    9  43    36    a

    3  2016-01-03  13  58    60    l

    4  2016-01-04  20  22    11    q

    5  2016-01-05    5  44    47    p

    6  2016-01-06  18  52    37    k

    7  2016-01-07  19  12    43    r

    8  2016-01-08  12  35      6    i

    9  2016-01-09  11  7    38    e

    10 2016-01-10    1  14    21    b

    11 2016-01-11    3  20    42    w

    12 2016-01-12  14  1    32    t

    13 2016-01-13  23  19    52    h

    14 2016-01-14  21  41    26    s

    15 2016-01-15    8  16    25    o

    现在,我们需要把date,hour,min和second列合并为新列datetime。通常,R中的日期时间格式为"Year-Month-Day-Hour:Min:Second"。

    dataNew <- data %>%

    unite(datehour, date, hour, sep = ' ') %>%

    unite(datetime, datehour, min, second, sep = ':')

    dataNew

    datetime event

    1  2016-01-01 7:30:29    u

    2  2016-01-02 9:43:36    a

    3  2016-01-03 13:58:60    l

    4  2016-01-04 20:22:11    q

    5  2016-01-05 5:44:47    p

    6  2016-01-06 18:52:37    k

    7  2016-01-07 19:12:43    r

    8  2016-01-08 12:35:6    i

    9  2016-01-09 11:7:38    e

    10  2016-01-10 1:14:21    b

    11  2016-01-11 3:20:42    w

    12  2016-01-12 14:1:32    t

    13 2016-01-13 23:19:52    h

    14 2016-01-14 21:41:26    s

    15  2016-01-15 8:16:25    o

    separate

    separate的调用格式为:

    separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE,

    convert = FALSE, extra = "warn", fill = "warn", ...)

    我们可以用separate函数将数据恢复到刚创建的时候,如下所示:

    data1 <- dataNew %>%

    separate(datetime, c('date', 'time'), sep = ' ') %>%

    separate(time, c('hour', 'min', 'second'), sep = ':')

    data1

    date hour min second event

    1  2016-01-01  07  30    29    u

    2  2016-01-02  09  43    36    a

    3  2016-01-03  13  59    00    l

    4  2016-01-04  20  22    11    q

    5  2016-01-05  05  44    47    p

    6  2016-01-06  18  52    37    k

    7  2016-01-07  19  12    43    r

    8  2016-01-08  12  35    06    i

    9  2016-01-09  11  07    38    e

    10 2016-01-10  01  14    21    b

    11 2016-01-11  03  20    42    w

    12 2016-01-12  14  01    32    t

    13 2016-01-13  23  19    52    h

    14 2016-01-14  21  41    26    s

    15 2016-01-15  08  16    25    o

    首先,将datetime分为date列和time列。然后,将time列分为hour,min,second列。

    相关文章

      网友评论

          本文标题:R语言tidyr包的使用

          本文链接:https://www.haomeiwen.com/subject/udiiqxtx.html