【发布时间】:2014-02-12 17:37:45
【问题描述】:
我有一个很大的Data Table,有两列。我希望在特定列上应用自定义函数。产生问题的代码如下:
require(data.table)
X <- rep("This is just random text", 1e5)
data <- data.frame(1:1e5, replicate(1, X, simplify=FALSE), stringsAsFactors=FALSE)
colnames(data) <- paste("X", seq_len(ncol(data)), sep="")
DT <- as.data.table(data)
现在,我们有一个大数据表,看起来像
| X1 | X2 |
|----|-------------------------|
| 1 | This is just random text|
| 2 | This is just random text|
| 3 | This is just random text|
| 4 | This is just random text|
| .. | ... |
如果考虑到这个 data.table 将非常大(大约~100M 行),我想对这个列的任何一个做一些向量操作怎么办。
我们以 X1 列为例。假设,我想对其应用以下功能:
Fun4X1 <- function(x){return(x+x*2)}
X2 列上有一个非常复杂的 NLP 函数,看起来像
Fun4X2 <- function(x){
require(stringr)
return(str_split(x, " ")[[1]][1])
}
我应该如何为大型数据集执行此操作?请建议分钟。耗时的方法,因为我的 Function 本身就非常复杂。
附:我已经尝试过foreach、sapply,当然还有for-loop,在一个相当不错的硬件系统上它们都非常慢。
【问题讨论】:
-
使用
Fun4X2[DT$X2]有什么问题? -
另外,如果您正在处理文本,请熟悉
grep和gsub-stringr函数是这些非常强大的函数的简单包装。 -
DT[, list(Fun4X1(X1), Fun4X3(X2))]怎么样,其中“Fun4X3”定义为:Fun4X3 <- function(x) strsplit(x, " ")[[1]][1] -
我没有注意,只是摆脱了您的 stringr 代码,因为我知道它要慢得多。试试这个:
Fun4X3 <- function(x) vapply(strsplit(x, " "), function(y) y[1], character(1))。这也应该返回一个向量,而不是一个列表。 -
@AnandaMahto,对于这个正则表达式,
fixed=TRUE也可以更快。
标签: r function data.table apply large-data