2017-01-04 76 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 –