修剪data.table列中的空格

时间:2013-10-08 19:20:19

标签: r data.table

我使用fread导入非常大的.CSV文件。有些列在我需要删除的文本后面有空格。这需要花费太多时间(小时)。

以下代码有效,但system.time上的命令非常慢(我的计算机上大约12秒,真实文件要大得多)。

library(data.table)
library(stringr)

# Create example-data
df.1 <- rbind(c("Text1        ", 1, 2), c("Text2        ", 3, 4), c("Text99       ", 5, 6))

colnames(df.1) <- c("Tx", "Nr1", "Nr2")
dt.1 <- data.table(df.1)
for (i in 1:15) {
  dt.1 <- rbind(dt.1, dt.1)
}

# Trim the "Tx"-column
dt.1[, rowid := 1:nrow(dt.1)]
setkey(dt.1, rowid)
system.time( dt.1[, Tx2 :={ str_trim(Tx) }, by=rowid] )
dt.1[, rowid:=NULL]
dt.1[, Tx:=NULL]
setnames(dt.1, "Tx2", "Tx")

有没有更快的方法来修改data.tables中的空格?

3 个答案:

答案 0 :(得分:3)

system.time( dt.1[, Tx2 :={ str_trim(Tx) }, by=rowid] )
   user  system elapsed 
 19.026   0.105  19.021 

system.time(  dt.1[,  Tx2 := gsub("\\s+$", "", as.character(Tx)), by=rowid]) 
   user  system elapsed 
  4.789   0.053   4.773 

答案 1 :(得分:2)

您只能对“Tx”的唯一值进行操作(假设您实际上有一些重复,如示例所示):

dt.1[, Tx2:=str_trim(Tx),     by=1:nrow(dt.1)]
dt.1[, Tx3:=str_trim(Tx),     by=Tx]

dt.1[, all.equal(Tx2,Tx3)]    # TRUE

在@ DWin的答案中使用gsub代替str_trim也会加快速度,无论您是否有重复的“Tx”值。

编辑:正如@DWin指出的那样,没有理由按行开始,因此str_trim不需要进行矢量化。所以,我改变了我的答案。

答案 2 :(得分:1)

您可以使用stringr包中的str_trim和dplyr中的mutate

df %>%
mutate(column1 = str_trim(column1))