For循环替代大数据

时间:2017-01-21 14:22:10

标签: r for-loop time data.table time-series

我拥有包含数百万条记录的庞大数据。我只是分享它的子集。

    data<-structure(list(email_address_hash = structure(c(1L, 1L, 2L, 2L, 
    2L, 3L, 3L), .Label = c("0004eca7b8bed22aaf4b320ad602505fe9fa9d26", 
    "00198ee5364d73796e0e352f1d2576f8e8fa99db", "35c0ef2c2a804b44564fd4278a01ed25afd887f8"
    ), class = "factor"), open_time = structure(c(1L, 5L, 7L, 3L, 
    2L, 4L, 6L), .Label = c(" 04:39:24", " 06:31:24", " 07:05:23", 
    " 09:57:20", " 10:39:43", " 19:00:09", " 21:12:04"), class = "factor")), .Names = c("email_address_hash", 
    "open_time"), row.names = c(NA, -7L),  class = c( 
    "data.frame"))
    require(data.table)
    setDT(data)

这就是我的数据的样子

enter image description here

我想以向量的形式将每个email_address_hash的open_times放在它前面。我尝试了以下方法

data <- data[, .(open_times = paste(open_time, collapse = "")), by = email_address_hash]

str(data)
Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ email_address_hash: Factor w/ 36231 levels "00012aec4ca3fa6f2f96cf97fc2a3440eacad30e",..: 2 16 7632
 $ open_times        : chr  " 04:39:24 10:39:43" " 21:12:04 07:05:23 06:31:24" " 09:57:20 19:00:09"
 - attr(*, ".internal.selfref")=<externalptr> 

我想解决两件事

1)首先想要从open_times中删除前导空格

2)我想分别对待email_address_hash前面的每个open_times。请参阅下文,open_times的元素被连接成一个元素。

当前输出

data$open_times[1]
[1] " 04:39:24 10:39:43"

NROW(data$open_times[1])
[1] 1

所需输出

data$open_times[1]
[1]"04:39:24" "10:39:43"

NROW(data$open_times[1])
    [1] 2

对于我可以做的单个元素

unlist(strsplit(trimws(data$open_times[1]),split = " "))

但是由于我的数据非常庞大,我想避免循环,因为它需要花费很多时间来迭代所有这些东西。任何人都可以为我提供一个更快的大数据解决方案吗?数百万甚至数十亿的记录。使用data.table的解决方案更加明显

如果您不清楚,请告诉我。

2 个答案:

答案 0 :(得分:1)

Hadoop MapReduce可能就是您需要的。之前我曾经使用它来计算大量文本集中短语出现次数等项目。我想它也可以改变它的用途吗?

答案 1 :(得分:1)

众所周知,R对于大数据并不好 - 考虑切换到hadoop。话虽如此,这里有一篇关于如何让R跑得更快的文章:https://www.r-bloggers.com/five-ways-to-handle-big-data-in-r/

至于在向量中获取列,我认为列已经是向量:

> data[[2]]
[1] "04:39:24" "10:39:43"
> NROW(data$open_time)
[1] 2

编辑:感谢@Frank指出OP正在使用数据表。