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

Wie*_*314 4 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)
Run Code Online (Sandbox Code Playgroud)

'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 ...
Run Code Online (Sandbox Code Playgroud)

在两个层面上哪个错了.该因素没有标签.只有第一次观察重复100次

ali*_*ire 10

mutate_if是你的朋友.如果你不在乎你是否转换为角色,你可以使用

raw %>% mutate_if(is.factor, trimws)
Run Code Online (Sandbox Code Playgroud)

这表明你可以重新转换为因素:

raw %>% mutate_if(is.factor, funs(factor(trimws(.))))
Run Code Online (Sandbox Code Playgroud)

如果要保持类型,可以使用更复杂的类型

raw %>% mutate_if(is.factor, funs(`levels<-`(., trimws(levels(.)))))
Run Code Online (Sandbox Code Playgroud)

基准R等价物

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

虽然如果它是一个单一的变量,你知道哪个,基数很干净:

levels(raw$a) <- trimws(levels(raw$a))
Run Code Online (Sandbox Code Playgroud)

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

raw %>% mutate_if(is.factor, fct_relabel, trimws)
Run Code Online (Sandbox Code Playgroud)

或者对于单个变量,

raw %>% mutate(a = fct_relabel(a, trimws))
Run Code Online (Sandbox Code Playgroud)

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