使用dplyr链从因子标签中删除尾随空格

时间:2017-01-04 15:35:10

标签: r 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次

2 个答案:

答案 0 :(得分:10)

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))

编辑:现在forcats::relabel(tidyverse的一部分)可以让函数更容易更改级别:

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

或单个变量

raw %>% mutate(a = fct_relabel(a, trimws))

它也会接受匿名函数,如果你愿意,还包括purrr风格的~trimws(.x)

答案 1 :(得分: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