Удаление пробелов из всего фрейма данных в 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])
}
}