使用gsub,trim等修剪data.frame或data.table中的列

我有一个关于删除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]) 
点赞