【问题标题】:r trim columns in data.frame or data.table using gsub,trim, etcr 使用 gsub、trim 等修剪 data.frame 或 data.table 中的列
【发布时间】: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


【解决方案1】:

使用plyr 中的colwisestringr 中的str_trim

require(plyr)
require(stringr)
data[, odd_columns] <- colwise(str_trim)(data[, odd_columns]) 

【讨论】:

  • 那么快吗? (主要是 OP 正在寻找)
  • 没有计时但修剪应该比正则表达式搜索快得多。并且避免使用 [ ] 的 data.frames 的多个子集应该加快速度。
【解决方案2】:

使用 dplyr 和基本函数 trimws,您可以一次修剪所有字符列;

mutate_if(data, is.character, funs(trimws(.)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 2014-01-30
    • 1970-01-01
    • 2012-04-12
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多