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