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年编辑:
使用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]))
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()如果您希望使用其他不同的空格删除功能,可以将功能切换为其他功能。
接受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.
小智 5
您可以在 R 3.2 中的所有列上使用 trimws 函数。
myData[,c(1)]=trimws(myData[,c(1)])
您可以对数据集中的所有列循环此操作。它在处理大型数据集时也具有良好的性能。
拿起 Fremzy 和 Mielniczuk,我得出了以下解决方案:
data.frame(lapply(df, function(x) if(class(x)=="character") trimws(x) else(x)), stringsAsFactors=F)
Run Code Online (Sandbox Code Playgroud)
它适用于混合数字/字符数据框,仅操作字符列。