按时间顺序对r数据帧中的4个组中的行进行排序

时间:2017-06-21 15:34:25

标签: r

我有一个数据框,第一列为id,第二列为日期。其他3列包含一些其他随机值。

数据帧的大小= 5列和160000行。

我想根据日期的时间顺序对第二列中的记录对前4条记录进行排序。 4中最老的记录应该排在第一位,最新记录应该排在最后。 在此之后,我必须继续对4组中的所有行进行排序。

ID  Date        A   B   C   
X   10/27/2011  12  47  78
Y   09/28/2015  27  14  41
Z   01/14/2013  24  25  45
W   04/21/2005  14  74  21
-
-
-
-
upto 160000 rows



 output

    ID  Date        A   B   C
    W   04/21/2005  14  74  21
    X   10/27/2011  12  47  78
    Z   01/14/2013  24  25  45
    Y   09/28/2015  27  14  41

-
-
-
upto 160000 rows

任何方式这样做?

我现在使用此功能但无法将其拆分为4行

d[order(as.Date(d$df, format="%d/%m/%Y")),]

列的数据类型是整数。我想把它当作日期阅读。

由于

2 个答案:

答案 0 :(得分:0)

您需要添加一个索引列,例如每四行重复一次,然后您可以使用它来分组。

我在这里提供了一个示例,您可以使用日期列进行修改,但它的想法相同。

d <- data.frame(ID = 1:16, df = as.integer(runif(16, 0,30)))

# add an index
d$by <- rep(1:(nrow(d)/4), each = 4)
d

# sort by the index
sort.ind <- by(d, d$by, function(x) x[order(x$df, decreasing = T),])

# bind the sorted data frames together
d.sort <- do.call(rbind, sort.ind)

d.sort

答案 1 :(得分:0)

您可以使用整数除法%/%来提供&#34;虚拟&#34;每组四个索引:

# recreate a random DF
set.seed(123)
DF <- 
data.frame(ID=paste0('ID',1:10),
           Date=c("21/06/2017", "23/06/2017", "10/06/2017", "18/06/2017", "27/06/2017", 
                  "01/06/2017", "13/06/2017", "07/06/2017", "24/06/2017", "05/06/2017"),
           A=rnorm(10,4,100))

# define virtual indexes
groupsOf4 <- (1:nrow(DF)-1) %/% 4
# order by groupsOf4 and then by Date
sortedDF <- DF[order(groupsOf4, as.Date(DF$Date, format="%d/%m/%Y")),]

结果:

> DF
     ID       Date          A
1   ID1 21/06/2017  -52.04756
2   ID2 23/06/2017  -19.01775
3   ID3 10/06/2017  159.87083
4   ID4 18/06/2017   11.05084
5   ID5 27/06/2017   16.92877
6   ID6 01/06/2017  175.50650
7   ID7 13/06/2017   50.09162
8   ID8 07/06/2017 -122.50612
9   ID9 24/06/2017  -64.68529
10 ID10 05/06/2017  -40.56620

> sortedDF
     ID       Date          A
3   ID3 10/06/2017  159.87083
4   ID4 18/06/2017   11.05084
1   ID1 21/06/2017  -52.04756
2   ID2 23/06/2017  -19.01775
6   ID6 01/06/2017  175.50650
8   ID8 07/06/2017 -122.50612
7   ID7 13/06/2017   50.09162
5   ID5 27/06/2017   16.92877
10 ID10 05/06/2017  -40.56620
9   ID9 24/06/2017  -64.68529