【问题标题】:How to group a data.frame by date?如何按日期对 data.frame 进行分组?
【发布时间】:2013-02-28 18:14:57
【问题描述】:

我有一个格式如下的 .csv 文件:

Date       ,     Time  , Value
1899-01-01 ,  4:00:00  ,    1
1899-01-01 ,  4:01:00  ,    2
1899-01-01 ,  4:02:00  ,    3
1899-01-01 ,  4:03:00  ,    4
1899-01-01 ,  4:04:00  ,    5
1900-08-22 , 22:00:00  ,  101
1900-08-22 , 22:01:00  ,  102
2013-08-29 ,  4:00:00  , 1000
2013-02-29 ,  4:02:00  , 1001
2013-02-29 ,  4:03:00  , 1002

group by date 是否可以生成以下格式的data.table

Date      , Vector(variable length)
1899-02-28, c(1,2,3,4,5)
1900-08-22, c(101,102)
1900-08-22, c(1000,1001,1002)

这是我迄今为止最好的(经过一天的尝试):

raw <- read.csv(pathName, header = TRUE, stringsAsFactors = FALSE)
groupedByDate <- split(raw, raw$Date)

但是,这似乎会生成一个非常宽的表格,每个日期有一列,这与我想要的不太接近。

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    如何在名为“mydf”的data.frame 上使用aggregate,如下所示:

    > temp <- aggregate(Value ~ Date, mydf, as.vector) 
    > temp
             Date         Value
    1 1899-01-01  1, 2, 3, 4, 5
    2 1900-08-22       101, 102
    3 2013-02-29     1001, 1002
    4 2013-08-29           1000
    

    “值”列现在是 list,其中包含您的向量。

    > temp$Value
    $`0`
    [1] 1 2 3 4 5
    
    $`1`
    [1] 101 102
    
    $`2`
    [1] 1001 1002
    
    $`3`
    [1] 1000
    

    split 您可能正在寻找的是:

    > split(mydf$Value, mydf$Date)
    $`1899-01-01 `
    [1] 1 2 3 4 5
    
    $`1900-08-22 `
    [1] 101 102
    
    $`2013-02-29 `
    [1] 1001 1002
    
    $`2013-08-29 `
    [1] 1000
    

    【讨论】:

    • 谢谢,这非常棒!我会把你的答案标记为答案,就像你是第一个一样。
    【解决方案2】:

    使用aggregatepaste0

    > aggregate(Value ~ Date, data=DF, FUN=paste0 )
             Date         Value
    1 1899-01-01  1, 2, 3, 4, 5
    2 1900-08-22       101, 102
    3 2013-02-29     1001, 1002
    4 2013-08-29           1000
    

    【讨论】:

    • 非常感谢您的回答,非常感谢。 p.s.我实际上想要一个数字向量,所以它是“c”而不是“paste”。
    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2017-10-29
    • 2013-12-06
    相关资源
    最近更新 更多