我有一个关于删除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)
}
最佳答案 从stringr中使用plyr和str_trim中的colwise.
require(plyr)
require(stringr)
data[, odd_columns] <- colwise(str_trim)(data[, odd_columns])