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

Thi*_*dge 11 whitespace replace r gsub

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

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

gsub( " ", "", mydata) 
Run Code Online (Sandbox Code Playgroud)

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

str_replace( " ", "", mydata)
Run Code Online (Sandbox Code Playgroud)

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

erase_all(mydata, " ")
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

PKu*_*mar 18

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

 apply(myData,2,function(x)gsub('\\s+', '',x))
Run Code Online (Sandbox Code Playgroud)

希望这有效.

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

as.data.frame(apply(myData,2,function(x)gsub('\\s+', '',x)))
Run Code Online (Sandbox Code Playgroud)

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]))
Run Code Online (Sandbox Code Playgroud)

输出:

> 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
Run Code Online (Sandbox Code Playgroud)


tmf*_*mnk 13

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

data %>%
 mutate_if(is.character, trimws)
Run Code Online (Sandbox Code Playgroud)

或者考虑到所有变量都具有类特征:

data %>%
 mutate_all(trimws)
Run Code Online (Sandbox Code Playgroud)

由于dplyr 1.0.0(仅字符串):

data %>%
 mutate(across(where(is.character), trimws))
Run Code Online (Sandbox Code Playgroud)

或者如果所有列都是字符串:

data %>%
 mutate(across(everything(), trimws))
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 11

许多答案都比较老,所以在2019年这里是一个简单的dplyr答案,它将仅在字符列上起作用以删除尾随和前导空格。

library(dplyr)
library(stringr)

data %>%
  mutate_if(is.character, str_trim)
Run Code Online (Sandbox Code Playgroud)

str_trim()如果您希望使用其他不同的空格删除功能,可以将功能切换为其他功能。

  • 非常相似。查看“?is.factor”和“?as.character”。这里的第二个答案表明了这一点。/sf/ask/199571081/ (2认同)

Ant*_*zuk 7

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

df <- data.frame(lapply(df, trimws), stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

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

如果您的原始类型正常,请应用下面的MarkusN解决方案/sf/answers/2647069211/

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

  • 我尝试过这个解决方案,但它会将所有列更改为factor. (4认同)

小智 5

您可以在 R 3.2 中的所有列上使用 trimws 函数。

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

您可以对数据集中的所有列循环此操作。它在处理大型数据集时也具有良好的性能。


Mar*_*usN 5

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

data.frame(lapply(df, function(x) if(class(x)=="character") trimws(x) else(x)), stringsAsFactors=F)
Run Code Online (Sandbox Code Playgroud)

它适用于混合数字/字符数据框,仅操作字符列。