Удаление пробелов из всего кадра данных в R
Я пытаюсь удалить пустое пространство, которое у меня есть в фрейме данных (используя R). Кадр данных большой ( > 1gb) и имеет несколько столбцов, которые содержат пробел в каждом вводе данных.
Есть ли быстрый способ удалить пустое пространство из всего кадра данных? Я пытался сделать это на подмножестве первых 10 строк данных, используя:
gsub( " ", "", mydata)
Это, похоже, не работает, хотя R возвратил результат, который я не смог интерпретировать.
str_replace( " ", "", mydata)
R вернул 47 предупреждений и не удалял пробел.
erase_all(mydata, " ")
R вернула ошибку: "Ошибка: не удалось найти функцию" erase_all ""
Я бы очень признателен за помощь в этом, так как последние 24 часа пытались решить эту проблему.
Спасибо!
Ответы
Ответ 1
Если я правильно понял вас, вы хотите удалить все пробелы из всего фрейма данных, я думаю, что код, который вы используете, хорош для удаления пробелов в именах столбцов. Я думаю, вы должны попробовать следующее:
apply(myData,2,function(x)gsub('\\s+', '',x))
Надеюсь, что это сработает.
Это вернет матрицу, однако, если вы хотите изменить ее на кадр данных, выполните следующие действия:
as.data.frame(apply(myData,2,function(x)gsub('\\s+', '',x)))
EDIT В 2017 году:
Используя sapply
и trimws
функцию с both=T
, можно удалить ведущие и конечные пробелы, но не внутри нее. Поскольку не было никаких входных данных, предоставленных OP, я добавляю фиктивный пример для получения результатов.
df <- data.frame(val = c(" abc"," klm","dfsd "),val1 = c("klm ","gdfs","123"),num=1:3,num1=2:4,stringsAsFactors = F)
truth <- sapply(df,is.character)
df1 <- data.frame(cbind(sapply(df[,truth],trimws,which="both"),df[,!truth]))
Выход
> df1
val val1 num num1
1 abc klm 1 2
2 klm gdfs 2 3
3 dfsd 123 3 4
> str(df1)
'data.frame': 3 obs. of 4 variables:
$ val : chr "abc" "klm" "dfsd"
$ val1: chr "klm" "gdfs" "123"
$ num : int 1 2 3
$ num1: int 2 3 4
Ответ 2
Многие ответы устарели, поэтому здесь, в 2019 году, есть простой ответ dplyr
, который будет работать только на символьных столбцах, чтобы удалить конечные и начальные пробелы.
library(dplyr)
library(stringr)
data %>%
mutate_if(is.character, str_trim)
Вы можете отключить функцию str_trim()
для других, если вам нужен другой вариант удаления пробелов.
Ответ 3
Поднимая Fremzy и комментарий от Stamper, теперь это моя удобная процедура для очистки пробелов в данных:
df <- data.frame(lapply(df, trimws), stringsAsFactors = FALSE)
Как отмечали другие, это изменяет все типы на характер. В своей работе я сначала определяю типы, доступные в оригинале, и необходимые преобразования. После обрезки я снова применяю нужные типы.
Если ваши исходные типы в порядке, примените решение от MarkusN ниже fooobar.com/questions/807557/...
Те, кто работает с файлами Excel, возможно, захотят изучить пакет readxl, который по умолчанию имеет значение trim_ws = TRUE при чтении.
Ответ 4
Поднимаясь на Fremzy и Mielniczuk, я пришел к следующему решению:
data.frame(lapply(df, function(x) if(class(x)=="character") trimws(x) else(x)), stringsAsFactors=F)
Он работает для смешанных числовых /charactert dataframes, манипулирует только столбцами символов.
Ответ 5
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)/\1\2/g;s/^\s+//;s/\s+$//" your_file
Ответ 6
Если вы имеете дело с большими наборами данных, подобными этому, вы могли бы извлечь выгоду из скорости data.table
.
library(data.table)
setDT(df)
for (j in names(df)) set(df, j = j, value = df[[trimws(j)]])
Я бы ожидал, что это будет самым быстрым решением. Эта строка кода использует оператор set
data.table
, который очень быстро перебирает столбцы. Здесь есть приятное объяснение: Быстрый цикл с настройкой.
Ответ 7
Вы можете использовать функцию trimws в R 3.2 для всех столбцов.
myData[,c(1)]=trimws(myData[,c(1)])
Вы можете выполнить цикл для всех столбцов в вашем наборе данных. Он имеет хорошую производительность и с большими наборами данных.
Ответ 8
Если вы хотите сохранить классы переменных в data.frame
, вы должны знать, что использование apply
будет сжимать их, поскольку оно выводит matrix
, где все переменные преобразуются в character
или numeric
. Основываясь на коде Fremzy и Anthony Simon Mielniczuk, вы можете прокручивать столбцы вашего data.frame и обрезать пустое пространство только столбцами класса factor
или character
(и поддерживать ваши классы данных):
for (i in names(mydata)) {
if(class(mydata[, i]) %in% c("factor", "character")){
mydata[, i] <- trimws(mydata[, i])
}
}
Ответ 9
Я думаю, что простой подход с sapply, также работает, учитывая df вроде:
dat<-data.frame(S=LETTERS[1:10],
M=LETTERS[11:20],
X=c(rep("A:A",3),"?","A:A ",rep("G:G",5)),
Y=c(rep("T:T",4),"T:T ",rep("C:C",5)),
Z=c(rep("T:T",4),"T:T ",rep("C:C",5)),
N=c(1:3,'4 ','5 ',6:10),
stringsAsFactors = FALSE)
Вы заметите, что dat$N
станет персонажем класса из-за '4 ' & '5 '
(вы можете проверить с помощью class(dat$N)
)
Чтобы избавиться от пробелов в числовом столбце, просто преобразуйте в numeric
с помощью as.numeric
или as.integer
.
dat$N<-as.numeric(dat$N)
Если вы хотите удалить все пробелы, выполните:
dat.b<-as.data.frame(sapply(dat,trimws),stringsAsFactors = FALSE)
И снова используйте as.numeric
для столбца N (ause sapply преобразует его в character
)
dat.b$N<-as.numeric(dat.b$N)
Ответ 10
Одна возможность, включающая только dplyr
, может быть:
data %>%
mutate_if(is.character, trimws)
Или учитывая, что все переменные имеют классовый характер:
data %>%
mutate_all(trimws)