【问题标题】:Merge columns to time variable将列合并到时间变量
【发布时间】:2015-02-03 12:31:40
【问题描述】:

我有两个变量,小时和分钟。我想把它们变成一个单一的时间变量。

我尝试了以下方法,但没有成功:

test$hour <- as.numeric(test$hour)
test$min <- as.numeric(test$min)
test$time <- as.numeric(paste(test$hour, test$min, sep = ":"))

我也尝试了test$time &lt;- strptime(paste(test$hour, test$min), "%H:%M"),但得到了相同的 NA 结果。

我的数据如下所示:

period  hour    min count
1   6   30  4.526305487
1   6   31  11.07462598
1   6   32  15.07302674
1   6   33  17.93844752
1   6   34  20.49889392
1   6   35  28.34603524
1   6   36  35.16286361
1   6   37  25.27624761
1   6   38  45.84684409
1   6   39  30.7370854
1   6   40  35.92090899
1   6   41  39.28625563
1   6   42  46.0457034
1   6   41.5    41.76117201
1   6   44  85.97052453
1   6   45  73.57407496
1   6   46  91.80656632
1   6   47  90.10439703
1   6   48  54.2160676
1   6   49  57.30371657
1   6   50  62.67364806
1   6   51  63.37224904
1   6   52  72.71908655
1   6   53  95.71827014
1   6   54  102.5008019
1   6   55  87.97671488
1   6   56  73.1705666
1   6   57  79.63483099
1   6   58  71.61188378

PS:除此之外,我想间隔 3 或 5 分钟,并汇总这些计数,但能够拥有 %H:%M 也将是向前迈出的一大步。欢迎任何想法!

【问题讨论】:

    标签: r time intervals


    【解决方案1】:

    你可以试试

    test$time <- strptime(with(test, sprintf('%02d:%02d', hour, min)), '%H:%M')
    test$time[1:5]
    #[1] "2014-12-05 06:30:00 EST" "2014-12-05 06:31:00 EST"
    #[3] "2014-12-05 06:32:00 EST" "2014-12-05 06:33:00 EST"
    #[5] "2014-12-05 06:34:00 EST"
    

    更新

    对于aggregating的计数(sum),你可以试试

     aggregate(count~ cbind(timeGr=as.character(cut(time, breaks='3 min'))),
                                         test, FUN=sum)
                      timeGr     count
     #1  2014-12-05 06:30:00  30.67396
     #2  2014-12-05 06:33:00  66.78338
     #3  2014-12-05 06:36:00 106.28596
     #4  2014-12-05 06:39:00 147.70542
     #5  2014-12-05 06:42:00 132.01623
     #6  2014-12-05 06:45:00 255.48504
     #7  2014-12-05 06:48:00 174.19343
     #8  2014-12-05 06:51:00 231.80961
     #9  2014-12-05 06:54:00 263.64808
     #10 2014-12-05 06:57:00 151.24671
    

    或使用data.table

     library(data.table)
     setDT(test)[, list(count=sum(count)), 
               by=list(timeGr=cut(time,breaks='3 min'))]
     #                 timeGr     count
     #1: 2014-12-05 06:30:00  30.67396
     #2: 2014-12-05 06:33:00  66.78338
     #3: 2014-12-05 06:36:00 106.28596
     #4: 2014-12-05 06:39:00 147.70542
     #5: 2014-12-05 06:42:00 132.01623
     #6: 2014-12-05 06:45:00 255.48504
     #7: 2014-12-05 06:48:00 174.19343
     #8: 2014-12-05 06:51:00 231.80961
     #9: 2014-12-05 06:54:00 263.64808
     #10:2014-12-05 06:57:00 151.24671
    

    数据

     test <-  structure(list(period = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
     1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
     1L, 1L, 1L, 1L), hour = c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
     6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
     6L, 6L, 6L, 6L), min = c(30, 31, 32, 33, 34, 35, 36, 37, 38, 
     39, 40, 41, 42, 41.5, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 
     54, 55, 56, 57, 58), count = c(4.526305487, 11.07462598, 15.07302674, 
     17.93844752, 20.49889392, 28.34603524, 35.16286361, 25.27624761, 
     45.84684409, 30.7370854, 35.92090899, 39.28625563, 46.0457034, 
     41.76117201, 85.97052453, 73.57407496, 91.80656632, 90.10439703, 
     54.2160676, 57.30371657, 62.67364806, 63.37224904, 72.71908655, 
     95.71827014, 102.5008019, 87.97671488, 73.1705666, 79.63483099, 
     71.61188378)), .Names = c("period", "hour", "min", "count"), 
     class = "data.frame", row.names = c(NA, -29L))
    

    【讨论】:

    • 我仍然得到 NA :S 如果可能的话,我也会放弃日期,我只需要时间。
    • @user3507584 您可以尝试复制/粘贴我发布的数据然后使用代码吗?
    • 好的,发生的事情是您需要将变量设为整数,而不是数字。否则它将无法正常工作。谢谢@akrun!
    • @user3507584 我尝试使用as.numeric,它成功了。我正在使用R 3.1.2
    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多