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

问题描述 投票:10回答:9

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

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

gsub( " ", "", mydata) 

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

str_replace( " ", "", mydata)

R返回了47个警告并且没有移除空白区域。

erase_all(mydata, " ")

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

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

谢谢!

r replace whitespace gsub
9个回答
17
投票

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

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

希望这有效。

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

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

2017年编辑:

使用sapplytrimws函数与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

8
投票

很多答案都比较旧,所以2019年这里有一个简单的dplyr答案,它只对字符列进行操作以删除尾随和前导空格。

library(dplyr)
library(stringr)

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

如果你想要一个不同的空白删除风格,你可以为其他的切换str_trim()函数。


7
投票

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

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

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

如果您的原始类型没问题,请在https://stackoverflow.com/a/37815274/2200542下面的MarkusN中应用解决方案

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


4
投票

拿起Fremzy和Mielniczuk,我得出了以下解决方案:

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

它适用于混合数字/字符数据帧仅操纵字符列。


3
投票

R根本不是这种文件大小的合适工具。但有2个选项:

Use ffdply and 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))

Use sed (my preference)

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

3
投票

如果你正在处理像这样的大型数据集,你可以从data.table的速度中获益。

library(data.table)

setDT(df)

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

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


2
投票

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

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

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


0
投票

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

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

0
投票

我认为一个简单的方法与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)

要删除数字列上的空格,只需使用numeric或qazxsw poi转换为qazxsw poi。

as.numeric

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

as.integer

再次在col N上使用dat$N<-as.numeric(dat$N)(ause sapply将其转换为dat.b<-as.data.frame(sapply(dat,trimws),stringsAsFactors = FALSE)

as.numeric
© www.soinside.com 2019 - 2024. All rights reserved.