我有一个数据框,第一列为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")),]
列的数据类型是整数。我想把它当作日期阅读。
由于
答案 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