我试图在两列之后对数据框进行排序。第一列是 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
答案 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