【问题标题】:To chronologically sort rows in group of 4 in r dataframe在 r 数据帧中按时间顺序对 4 组中的行进行排序
【发布时间】:2017-06-22 00:22:37
【问题描述】:

我有一个数据框,第一列为 id ,第二列为 date 。其他 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")),]

列的数据类型是整数。我正在尝试将其读取为日期。

谢谢

【问题讨论】:

  • 你能提供一个可重现的例子吗?
  • 您的日期列是 Date/POSIXct 等还是字符类型? @simone 是对的……我们需要一个可重现的例子
  • 谢谢我添加了一个有问题的例子。
  • 嗯...您的格式"%d/%m/%Y" 与您的示例数据不一致,看起来更像"%m/%d/%Y"...

标签: r


【解决方案1】:

您可以使用整数除法%/% 为每组四个“虚拟”索引:

# 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

【讨论】:

  • 感谢 digEmAll 的帮助
【解决方案2】:

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

我在这里提供了一个例子,你可以用你的日期列来修改它,但它的想法是一样的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2014-06-07
    • 2012-06-26
    • 1970-01-01
    • 2012-07-20
    • 2020-02-03
    相关资源
    最近更新 更多