按日期排序和其他列

时间:2018-08-14 13:08:57

标签: r sorting date dataframe

我试图在两列之后对数据框进行排序。第一列是 0 6317 的数字,第二列是不同年份的1月到12月的日期,以mm-yy 格式。 以下是我的数据框的一部分:

         number    date         count
    1     0         Sep-13       10
    2     0         Jan-12       15
    3     0         Feb-13       4
    4     0         Oct-12       13
    5     0         Nov-13       14
    6    6317       Jan-12       20
    7    6317       Nov-13       40
    8    6317       Dez-13       20
    9    6317       Feb-13       10
   10    6317       Oct-12       15
   11    6317       Oct-13       19

我使用了以下命令

orderbydate <- count[order(as.Date(count$date, format=c("%b-%y")),]

orderbydate <- count[order(count[,1], count[,2]),]

我打算最终让它看起来像这样。

date        6317      0

Jan-12      20        15
Feb-12      8         10
Mrch-12     15        20
.           .          .
.           .          .
.           .          .
Jan-13      18        19
Feb-13      10        4
Mrch-13     14        2
Apr-13      11        9

3 个答案:

答案 0 :(得分:2)

我们可以先将yearmon转换为zoo类,然后再转换arrange

library(dplyr)
library(zoo)
count %>%
      arrange(number, as.yearmon(date, '%b-%y'))

或者不使用软件包,通过Date一天(例如01)将'date'转换为paste类,然后执行order

count[order(count$number, as.Date(paste0(count$date, "-01"), "%b-%y-%d")),]

答案 1 :(得分:0)

您可以使用重整形库中的cast()函数。

以下代码将产生所需的结果:
library(reshape) new_df <- cast(count, date~number)

答案 2 :(得分:0)

这是不使用任何软件包的另一种选择:

数据:

number  date    count
0   Sep-13  10
0   Jan-12  15
0   Feb-13  4
0   Oct-12  13
0   Nov-13  14
6317    Jan-12  20
6317    Nov-13  40
6317    Dec-13  20
6317    Feb-13  10
6317    Oct-12  15
6317    Oct-13  19

代码:

dt <- read.table('clipboard', header = T, stringsAsFactors = F)
dt$date <- as.Date(paste(dt$date, '01', sep = '-'), format = '%b-%y-%d')


> dt
   number       date count
1       0 2013-09-01    10
2       0 2012-01-01    15
3       0 2013-02-01     4
4       0 2012-10-01    13
5       0 2013-11-01    14
6    6317 2012-01-01    20
7    6317 2013-11-01    40
8    6317 2013-12-01    20
9    6317 2013-02-01    10
10   6317 2012-10-01    15
11   6317 2013-10-01    19

要获得您上面指示的内容,我们可以使用merge

> merge(dt[dt$number == 6317, 2:3], dt[dt$number == 0, 2:3], by = 'date', suffixes = c('_6317', '_0'), fill = T, all = T)
        date count_6317 count_0
1 2012-01-01         20      15
2 2012-10-01         15      13
3 2013-02-01         10       4
4 2013-09-01         NA      10
5 2013-10-01         19      NA
6 2013-11-01         40      14
7 2013-12-01         20      NA