2017-01-04 43 views
2

我有一个加载了数据框的因子标签中尾随有空白的数据框。我试图删除数据框中每个因素的尾随空格,但目前为止尚未成功。使用dplyr链去除因子标签中的尾随空格

可再现的例子

lvls <- c('a ', 
      'b ', 
      'c ') 
set.seed(314) 
raw <- data.frame(a = factor(sample(lvls,100, replace=T)), 
        b = sample(1:100,100)) 

proc <- raw %>% mutate_each(funs(ifelse(is.factor(.), 
             factor(as.character(trimws(.)), 
               labels=unique(as.character(.))), 
             .))) 

str(proc) 

'data.frame': 100 obs. of 2 variables: 
$ a: int 1 1 1 1 1 1 1 1 1 1 ... 
$ b: int 31 31 31 31 31 31 31 31 31 31 ... 

哪项是错误的在两个层面上。该因素没有标签。只有第一次观察重复100次

+0

如果你想要,我们可以做到这一点,即使没有'dplyr'。你只是想在任何因子变量上修饰()如果存在的话? –

+0

我知道,但我现在想知道我在做什么错'dplyr' – Wietze314

+1

检查'read.table'中的'strip.white'。 – Henrik

回答

6

mutate_if是你的朋友。如果你,如果你转换为字符不在乎,你可以只使用

raw %>% mutate_if(is.factor, trimws) 

这表明你可以再转换成因素:

raw %>% mutate_if(is.factor, funs(factor(trimws(.)))) 

如果你想保持的类型,你可以使用更旋绕

raw %>% mutate_if(is.factor, funs(`levels<-`(., trimws(levels(.))))) 

碱基r等效将是

raw[] <- lapply(raw, function(x){if (is.factor(x)) {levels(x) <- trimws(levels(x))} ; x}) 

但如果它是一个变量,你知道是哪个,基础是很干净:

levels(raw$a) <- trimws(levels(raw$a)) 
+1

谢谢,从现在起mutate_if是我的新朋友 – Wietze314

1

沿着这些方向?

l = lapply(raw, function(x) {if(is.factor(x)){x <- trimws(x)};x}) 
head(as.data.frame(l)) 
# a b 
#1 a 31 
#2 a 55 
#3 c 68 
#4 a 18 
#5 a 72 
#6 a 64 
+1

你也可以试试'raw [] < - lapply(raw,function(x)type.convert(trimws(as.character(x)),as.is = TRUE))'Great post不使用任何外部包。加一。 – akrun

+1

谢谢@akrun –