我一直在尝试删除数据框中的空白区域(使用R)。数据框很大(> 1gb),并且有多个列,每个数据条目中都包含空格。
有没有快速的方法从整个数据框中删除空白?我一直在尝试使用以下方法对前10行数据的子集执行此操作:
gsub( " ", "", mydata)
这似乎不起作用,虽然R返回了我无法解释的输出。
str_replace( " ", "", mydata)
R返回了47个警告并且没有移除空白区域。
erase_all(mydata, " ")
R返回错误,说“错误:找不到功能”erase_all“'
我真的很感激一些帮助,因为我花了最后24小时试图解决这个问题。
谢谢!
如果我理解正确,那么你想从整个数据框中删除所有空格,我想你正在使用的代码有利于删除列名中的空格。我想你应该试试这个:
apply(myData,2,function(x)gsub('\\s+', '',x))
希望这有效。
这将返回一个矩阵,但是,如果要将其更改为数据框,则执行以下操作:
as.data.frame(apply(myData,2,function(x)gsub('\\s+', '',x)))
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
很多答案都比较旧,所以2019年这里有一个简单的dplyr
答案,它只对字符列进行操作以删除尾随和前导空格。
library(dplyr)
library(stringr)
data %>%
mutate_if(is.character, str_trim)
如果你想要一个不同的空白删除风格,你可以为其他的切换str_trim()
函数。
接受Fremzy和Stamper的评论,这是我清理数据空白的常用例程:
df <- data.frame(lapply(df, trimws), stringsAsFactors = FALSE)
正如其他人所说,这会改变所有类型的特征。在我的工作中,我首先确定原始类型和所需的转换类型。修剪后,我重新应用所需的类型。
如果您的原始类型没问题,请在https://stackoverflow.com/a/37815274/2200542下面的MarkusN中应用解决方案
那些使用Excel文件的人可能希望探索readxl包,在读取时默认为trim_ws = TRUE。
拿起Fremzy和Mielniczuk,我得出了以下解决方案:
data.frame(lapply(df, function(x) if(class(x)=="character") trimws(x) else(x)), stringsAsFactors=F)
它适用于混合数字/字符数据帧仅操纵字符列。
R根本不是这种文件大小的合适工具。但有2个选项:
使用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 -ir "s/(\S)\s+(/S)/\1\2/g;s/^\s+//;s/\s+$//" your_file
如果你正在处理像这样的大型数据集,你可以从data.table
的速度中获益。
library(data.table)
setDT(df)
for (j in names(df)) set(df, j = j, value = df[[trimws(j)]])
我希望这是最快的解决方案。这行代码使用set
的data.table
运算符,它可以非常快速地循环遍历列。这里有一个很好的解释:Fast looping with set。
您可以在R 3.2中对所有列使用trimws功能。
myData[,c(1)]=trimws(myData[,c(1)])
您可以为数据集中的所有列循环。它对大型数据集也有很好的表现。
如果你想在你的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])
}
}
我认为一个简单的方法与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