我加载的数据框在因子标签中有尾随空格。我试图删除数据帧中每个因素的尾随空格但到目前为止都没有成功。
可再现的例子
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 :(得分: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