Удаление пробелов из всего фрейма данных в R

Я пытался удалить пробел, который у меня есть в фрейме данных (используя R). Фрейм данных большой (>1 ГБ) и имеет несколько столбцов, содержащих пробелы в каждой записи данных.

есть ли быстрый способ удалить пробел из всего фрейма данных? Я пытался сделать это на подмножестве первые 10 строк данных, используя:

gsub( " ", "", mydata) 

Это, похоже, не сработало, хотя R вернул вывод, который я не смог интерпретировать.

str_replace( " ", "", mydata)

R вернулся 47 предупреждений и не удалил пробел.

erase_all(mydata, " ")

R вернул сообщение об ошибке "ошибка: не удалось найти функцию "erase_all""

Я был бы очень признателен за помощь в этом, поскольку я провел последние 24 часа, пытаясь решить эту проблему.

спасибо!

7 ответов


если я правильно понял вас, то вы хотите удалить все пробелы из всего фрейма данных, я думаю, что код, который вы используете, хорош для удаления пробелов в именах столбцов.Я думаю, вы должны попробовать это:

 apply(myData,2,function(x)gsub('\s+', '',x))

надеюсь, что это работает.

это вернет матрицу, однако, если вы хотите изменить ее на фрейм данных, то сделайте:

as.data.frame(apply(myData,2,function(x)gsub('\s+', '',x)))

изменить в 2017 году:

используя sapply и


подбирая Fremzy и комментарий от Stamper, это теперь моя удобная процедура для очистки пробелов в данных:

df <- data.frame(lapply(df, trimws), stringsAsFactors = FALSE)

Как отмечали другие, это изменяет все типы на символ. В своей работе я сначала определяю типы, доступные в оригинале, и требуемые преобразования. После обрезки я повторно применяю необходимые типы.

если исходные типы в порядке, примените решение из MarkusN ниже https://stackoverflow.com/a/37815274/2200542

те, кто работает с файлами Excel, могут захотеть изучить пакет readxl, который по умолчанию trim_ws = TRUE при чтении.


R просто не подходит для такого размера файла. Однако есть 2 варианта :

используйте ffdply и FF base

использовать ff и ffbase упаковка:

library(ff)
library(ffabse)
x <- read.csv.ffdf(file=your_file,header=TRUE, VERBOSE=TRUE,
                 first.rows=1e4, next.rows=5e4)
x$split = as.ff(rep(seq(splits),each=nrow(x)/splits))
ffdfdply( x, x$split , BATCHBYTES=0,function(myData)        
             apply(myData,2,function(x)gsub('\s+', '',x))

используйте sed (мои предпочтения)

sed -ir "s/(\S)\s+(/S)//g;s/^\s+//;s/\s+$//" your_file 

вы можете использовать функцию trimws в R 3.2 для всех столбцов.

myData[,c(1)]=trimws(myData[,c(1)])

вы можете зациклить это для всех столбцов в наборе данных. Он также имеет хорошую производительность с большими наборами данных.


подхватив Фремзи и Мельничука, я пришел к следующему решению:

data.frame(lapply(df, function(x) if(class(x)=="character") trimws(x) else(x)), stringsAsFactors=F)

это работает для смешанных числовых/charactert таблиц данных обрабатывает только один символ-колонны.


если вы имеете дело с большими наборами данных, как это, вы можете действительно извлечь выгоду из скорости data.table.

library(data.table)

setDT(df)

for (j in names(df)) set(df, j = j, value = df[[trimws(j)]]) 

Я бы ожидал, что это будет самое быстрое решение. Эта строка кода использует set оператор data.table, который петляет по столбцам очень быстро. Здесь есть хорошее объяснение: быстрый цикл с set.


если вы хотите сохранить переменную классы data.frame - вы должны знать, что использование apply будет бить их, потому что он выводит matrix где все переменные преобразуются в либо character или numeric. Основываясь на коде Фремзи и Энтони Симона Мельничука, вы можете перебирать столбцы своих данных.рамка и обрезать пробел только столбцы класса factor или character (и поддерживайте свои классы данных):

for (i in names(mydata)) {
  if(class(mydata[, i]) %in% c("factor", "character")){
    mydata[, i] <- trimws(mydata[, i])
  }
}