修剪data.table列中的空白

Chr*_*ris 5 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")
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ank 4

您只能对“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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 感人的。by-vector的改变才是真正的改进。它也加速了 gsub() 方法。 (2认同)