split()函数

时间:2018-06-18 10:03:21

标签: r

我有一个csv文件,包含大约200,000行的事务。以下是数据的导入和少量预处理:

data <- read.csv("bitfinex_data/trades.csv", header=T)
data$date <- as.character(data$date)
data$date <- substr(data$date, 1, 10)
data$date <- as.numeric(data$date)
data$date <- as.POSIXct(data$date, origin="1970-01-01", tz = "GMT")

head(data)

id          exchange  symbol                date price     amount  sell
1 24892563       bf   btcusd 2018-01-02 00:00:00 13375 0.05743154 False
2 24892564       bf   btcusd 2018-01-02 00:00:01 13374 0.12226129 False
3 24892565       bf   btcusd 2018-01-02 00:00:02 13373 0.00489140 False
4 24892566       bf   btcusd 2018-01-02 00:00:02 13373 0.07510860 False
5 24892567       bf   btcusd 2018-01-02 00:00:02 13373 0.11606086 False
6 24892568       bf   btcusd 2018-01-02 00:00:03 13373 0.47000000 False

我的目标是获得每小时交易的代币金额。为此,我需要根据小时数分割数据,我采用以下方式进行分割:

tmp <- split(data, cut(data$date,"hour"))

然而,这花费的时间太长(最多1小时),我想知道这是split()cut()等功能的正常行为吗?有没有其他方法可以使用这两个函数?

更新:

在使用@Maurits Evers的好建议后,我的输出表如下所示:

# A tibble: 25 x 2
   date_hour     amount.sum
   <chr>              <dbl>
 1 1970-01-01 00       48.2
 2 2018-01-02 00     2746. 
 3 2018-01-02 01     1552. 
 4 2018-01-02 02     2010. 
 5 2018-01-02 03     2171. 
 6 2018-01-02 04     3640. 
 7 2018-01-02 05     1399. 
 8 2018-01-02 06      836. 
 9 2018-01-02 07      856. 
10 2018-01-02 08      819. 
# ... with 15 more rows

这正是我想要的,期望第一行,其中日期是从1970年开始。有关可能导致问题的原因的任何建议?我试图改变as.POSIXct()函数的origin参数,但这并没有解决问题。

2 个答案:

答案 0 :(得分:0)

我同意@Roland的评论。为了说明,这是一个例子。

  1. 让我们以一分钟的时间间隔生成一些包含200000个条目的数据。

    set.seed(2018);
    df <- data.frame(
        date = seq(from = as.POSIXct("2018-01-01 00:00"), by = "min", length.out = 200000),
        amount = runif(200000))
    head(df);
    #                 date     amount
    #1 2018-01-01 00:00:00 0.33615347
    #2 2018-01-01 00:01:00 0.46372327
    #3 2018-01-01 00:02:00 0.06058539
    #4 2018-01-01 00:03:00 0.19743361
    #5 2018-01-01 00:04:00 0.47431419
    #6 2018-01-01 00:05:00 0.30104860
    
  2. 我们现在(1)创建一个新列date_hour,其中包含日期&amp;完整日期和时间的小时部分,(2)group_bydate_hour,以及(3)amount列中的总和条目,以提供amount.sum

    df %>%
        mutate(date_hour = format(date, "%Y-%m-%d %H")) %>%
        group_by(date_hour) %>%
        summarise(amount.sum = sum(amount))
    ## A tibble: 3,333 x 2
    #   date_hour     amount.sum
    #   <chr>              <dbl>
    # 1 2018-01-01 00       28.9
    # 2 2018-01-01 01       26.4
    # 3 2018-01-01 02       32.7
    # 4 2018-01-01 03       29.9
    # 5 2018-01-01 04       29.7
    # 6 2018-01-01 05       28.5
    # 7 2018-01-01 06       34.2
    # 8 2018-01-01 07       33.8
    # 9 2018-01-01 08       30.7
    #10 2018-01-01 09       27.7
    ## ... with 3,323 more rows
    
  3. 速度非常快(我的2012款MacBook Air需要大约0.3秒),您应该可以根据具体情况轻松调整此示例。

答案 1 :(得分:0)

您可以使用tapply计算没有任何套餐的每小时总和。我使用Maurits Evers建议的随机数据:

set.seed(2018)
df <- data.frame(
    date = seq(from = as.POSIXct("2018-01-01 00:00"),
               by = "min", length.out = 200000),
    amount = runif(200000))
head(df)
##                  date     amount
## 1 2018-01-01 00:00:00 0.33615347
## 2 2018-01-01 00:01:00 0.46372327
## 3 2018-01-01 00:02:00 0.06058539
## 4 2018-01-01 00:03:00 0.19743361
## 5 2018-01-01 00:04:00 0.47431419
## 6 2018-01-01 00:05:00 0.30104860


tapply(df$amount,
       format(df$date, "%Y-%m-%d %H"),
       sum)
## 2018-01-01 00 2018-01-01 01 2018-01-01 02 
##      28.85825      26.39385      32.73600 
## 2018-01-01 03 2018-01-01 04 2018-01-01 05 
##      29.88545      29.74048      28.46781 
## ...