我一直在尝试删除数据框(使用R)中的空白区域。数据帧很大(> 1gb)并且具有多个列,每个数据条目中包含空格。
是否有快速方法从整个数据框中删除空白区域?我一直在尝试使用以下方法对前10行数据的子集执行此操作:
gsub( " ", "", mydata)
这似乎不起作用,虽然R返回了我无法解释的输出。
str_replace( " ", "", mydata)
R返回 47次警告,但未删除空格。
erase_all(mydata, " ")
R返回错误,说“错误:找不到功能”erase_all“'
我真的很感激一些帮助,因为我花了最后24小时试图解决这个问题。
谢谢!
答案 0 :(得分:16)
如果我理解正确,那么你想从整个数据框中删除所有空白区域,我想你正在使用的代码有利于删除列名中的空格。我想你应该试试这个:
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
答案 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个选项:
使用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
答案 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的列,并仅在类numeric
或factor
的列中修剪空白区域(并维护您的数据类):
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列上的空格,只需将numeric
或as.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)