从R中的整个数据框中删除空白

时间:2013-12-24 12:00:10

标签: r replace whitespace gsub

我一直在尝试删除数据框(使用R)中的空白区域。数据帧很大(> 1gb)并且具有多个列,每个数据条目中包含空格。

是否有快速方法从整个数据框中删除空白区域?我一直在尝试使用以下方法对前10行数据的子集执行此操作:

gsub( " ", "", mydata) 

这似乎不起作用,虽然R返回了我无法解释的输出。

str_replace( " ", "", mydata)

R返回 47次警告,但未删除空格。

erase_all(mydata, " ")

R返回错误,说“错误:找不到功能”erase_all“'

我真的很感激一些帮助,因为我花了最后24小时试图解决这个问题。

谢谢!

10 个答案:

答案 0 :(得分:16)

如果我理解正确,那么你想从整个数据框中删除所有空白区域,我想你正在使用的代码有利于删除列名中的空格。我想你应该试试这个:

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

希望这有效。

这将返回一个矩阵,但是,如果要将其更改为数据框,请执行以下操作:

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

2017年编辑:

sapply使用trimwsboth=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

答案 1 :(得分:7)

接受Fremzy和Stamper的评论,这是我清理数据空白的常用例程:

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

正如其他人所说,这会改变所有类型的角色。在我的工作中,我首先确定原始类型和所需的转换类型。修剪后,我重新应用所需的类型。

如果您的原始类型没问题,请在https://stackoverflow.com/a/37815274/2200542

下方的MarkusN中应用解决方案

使用Excel文件的人可能希望在阅读时探索readxl包,默认为trim_ws = TRUE。

答案 2 :(得分:4)

许多答案都比较老,因此在2019年,这里有一个简单的dplyr答案,该答案仅在字符列上起作用,以消除尾随和前导空格。

library(dplyr)
library(stringr)

data %>%
  mutate_if(is.character, str_trim)

如果您希望以其他方式去除空白,则可以将str_trim()功能切换为其他功能。

答案 3 :(得分:3)

R对于此类文件大小来说根本不是正确的工具。但有2个选项:

使用ffdply和ff base

使用ffffbase套餐:

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 

答案 4 :(得分:3)

接受Fremzy和Mielniczuk,我找到了以下解决方案:

viewDidLayoutSubviews

适用于混合数字/字符数据帧,仅处理字符列。

答案 5 :(得分:2)

您可以在R 3.2中对所有列使用trimws功能。

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

您可以为数据集中的所有列循环显示此内容。它对大型数据集也有很好的表现。

答案 6 :(得分:2)

如果您正在处理这样的大型数据集,那么您可以从data.table的速度中受益。

library(data.table)

setDT(df)

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

我希望这是最快的解决方案。这行代码使用set的{​​{1}}运算符,它可以非常快速地循环遍历列。这里有一个很好的解释:Fast looping with set

答案 7 :(得分:0)

如果你想在data.frame中维护变量类,你应该知道使用apply会破坏它们,因为它会输出matrix,其中所有变量都转换为{{} 1}}或character。基于Fremzy和Anthony Simon Mielniczuk的代码,您可以循环遍历data.frame的列,并仅在类numericfactor的列中修剪空白区域(并维护您的数据类):

character

答案 8 :(得分:0)

我认为,给定类似df的方法,使用sapply的简单方法也可以使用:

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)进行检查)

要摆脱numeic列上的空格,只需将numericas.numeric转换为as.integer

dat$N<-as.numeric(dat$N)

如果要删除所有空格,请执行以下操作:

dat.b<-as.data.frame(sapply(dat,trimws),stringsAsFactors = FALSE)

然后在第N行上再次使用as.numeric(因为应用将其转换为character

dat.b$N<-as.numeric(dat.b$N)

答案 9 :(得分:0)

仅涉及dplyr的一种可能性是:

data %>%
 mutate_if(is.character, trimws)

或者考虑到所有变量都是类字符:

data %>%
 mutate_all(trimws)