【发布时间】:2014-01-30 17:00:12
【问题描述】:
我有一个关于删除 data.frame 或 data.table 中的前导空格的问题。
我有可行的解决方案,但我正在尝试加快我的代码速度。
这是一些示例数据:
number_strings <- paste(" ",seq(from=1, to=100000, by=1)," ",sep="")
data <- as.data.frame(matrix(number_strings,nrow=length(number_strings),ncol=10),stringsAsFactors=FALSE)
colnames(data) <- paste("Col",seq(from=1, to=ncol(data), by=1),sep="")
这里有一些我想修剪的列:
odd_columns <- paste("Col",seq(from=1, to=ncol(data), by=2),sep="")
这是我目前的三个选项:
f_trim_for <- function(x,cols){
for(i in 1:length(cols))
{
x[,cols[i]] = trim(x[,cols[i]])
}
return(x)
}
system.time(data1 <- f_trim_for(data,odd_columns))
f_gsub_for <- function(x,cols){
for(i in 1:length(cols))
{
x[,cols[i]] <- gsub("^\\s+|\\s+$", "", x[,cols[i]], perl = TRUE)
}
return(x)
}
system.time(data2 <- f_gsub_for(data,odd_columns))
f_trim_dt <- function(x,cols){
data.table(x)[, (cols) := trim(.SD), .SDcols = cols]
}
system.time(data3 <- f_trim_dt(data,odd_columns))
以下是时间:
user system elapsed
f_trim_for 1.50 0.08 1.92
f_gsub_for 0.75 0.00 0.74
f_trim_dt 0.81 0.00 1.17
我的问题:有没有其他方法可以更快?
原因是我的实际数据是 150 万行和 110 列。因此,速度是一个主要问题。
我尝试了其他一些选项,但它们不起作用:
f_gsub_dt <- function(x,cols){
data.table(x)[, (cols) := gsub("^\\s+|\\s+$", "", .SD, perl = TRUE), .SDcols = cols]
}
f_set_dt <- function(x,cols){
for (j in cols)
{
set(x,x[[j]],j,gsub("^\\s+|\\s+$", "", j, perl = TRUE))
}
return(x)
}
【问题讨论】:
-
我看过那篇文章并从中使用了 gsub 方法。我试图在 data.tables 中做类似的事情。
-
看看最近这个问题的答案:stackoverflow.com/q/21056297/1412059你应该使用
set。 -
Roland,在我的问题结束时,我有一个示例,但无法使其正常工作。你能告诉我出了什么问题吗?
-
@Brad,Roland 的提示似乎会引导您找到您正在寻找的答案?为什么不自己将其发布为答案?
标签: r replace data.table trim gsub