我有一个关于在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)
}
答案 0 :(得分:2)
使用colwise
中的plyr
和str_trim
中的stringr
。
require(plyr)
require(stringr)
data[, odd_columns] <- colwise(str_trim)(data[, odd_columns])
答案 1 :(得分:0)
使用dplyr和基函数trimws,您可以一次修剪所有字符列;
mutate_if(data, is.character, funs(trimws(.)))