2015-08-30 75 views
1

我有一個數據幀一個因素轉換爲另一種R中

division | category 
    A  | tools 
    A  | work 
    B  | tools 
    B  | TOOLS 

都列因子變量。 如何將TOOLS轉換爲工具?

我試圖

df$category <- as.character(df$category) 
df$category <- lapply(df$category, function(x) { tolower(x) }) 
df$category <- as.factor(df$category) 

但隨後在最後一個命令我得到:

Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
Have you called 'sort' on a list? 

這是什麼意思?

回答

3

這個錯誤意味着你已經嘗試了列表,儘管不是那些單詞。它會被觸發,因爲您使用了lapply(),它返回一個列表。而在這種情況下as.factor()電話factor(),這反過來又調用這裏sort.list()

## from factor() 
if (missing(levels)) { 
    y <- unique(x, nmax = nmax) 
    ind <- sort.list(y) 
    ... 
} 

這是在錯誤發生。

as.factor(list(1, 2)) 
# Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
# Have you called 'sort' on a list? 

長話短說,你可以使用tolower()沒有lapply(),因爲它是矢量並執行字符脅迫你。

df$category <- factor(tolower(df$category)) 
df 
# division category 
# 1  A tools 
# 2  A  work 
# 3  B tools 
# 4  B tools 
+1

此外,對於'TOOLS'更具體的解決方案可能是'因子(GSUB( 「工具」, 「工具」,DF $類,固定= TRUE))' –

+0

並且還'$ DF類[DF $ category ==「TOOLS」] < - 「tools」',然後刪除未使用的級別 –

+0

另請參閱[this](http://stackoverflow.com/questions/28181753/grouping-factor-levels-in-一個數據表)我的問題或[這](http://stackoverflow.com/questions/19410108/cleaning-up-factor-levels-collapsing-multiple-levels-labels)相關的問題,如何組更普遍的因素 – MichaelChirico

2

我不認爲你需要使用lapply。這對我有效。

division=c("a","a","b","b") 
category=c("tools","work","tools","TOOLS") 

df=data.frame(division,category) 
df$category=tolower(df$category) 

> as.factor(df$category) 
[1] tools work tools tools