我有一个加载的数据帧,在因子标签中有空白空格.我试图删除数据帧中每个因素的尾随空格,但到目前为止都没有成功.
可重复的例子
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风格.