我使用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中的空格?
答案 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))