2017-05-02 115 views
0

我有我的數據集的一些因素變量,我嘗試將它們轉換爲數字與循環循環因素轉換爲數字

a = sample(c('a', 'b'), 100, replace = TRUE) 
b = sample(c('a', 'b'), 100, replace = TRUE) 
df = as.data.frame(cbind(a, b)) 
library(plyr); library(dplyr) 
for(i in df[, 1:2]) { 

    k = as.numeric(as.character(revalue(df[,i], 
              c('a' = 1, 
              'b'= 2 
              )))) 
} 

,我得到錯誤

Error in revalue(df[, i], c(a = "1", b = "2")) : 
    x is not a factor or a character vector. 

有什麼不對? NB重要的是, 'A' 等於1 & 'B'= 2

+0

你想幹什麼'的(我在1:2)'(或可替代'的(我在seq_along (df [,1:2]))''而不是'for(i in df [,1:2])' –

+1

對於您的示例數據,只需'df $ a < - as.numeric(df $ a)'和'df $ b < - as.numeric(df $ b)'將會起作用 – neilfws

回答

2

與往常一樣,R內置了做這樣的映射沒有問題的功能:

df[] <- lapply(df, function(x) c(a=1,b=2)[as.character(x)]) 
1

你不需要爲如一個循環:

library(plyr) 
as.data.frame(sapply(df, mapvalues,from = c("a", "b"),to = c(1, 2))) 

和:

df2$a <- as.numeric(as.character(df2$a)) 
df2$b <- as.numeric(as.character(df2$b)) 
class(df2$a) 
[1] "numeric" 
+0

這是一個很好的解決方案,但我們再次得到因子變量,在真實數據集中我有40個變量))) – Edward

1

只需指出:數據框是一個列表,並且lapply通常是一個很好的解決方案,用於列表。 ;)例如,您可以嘗試:

df[] <- lapply(df, function(x){ 
    if(is.factor(x)) return(revalue(x, c('a' = 1, 'b'= 2))) 
    else return(x) 
} ) 

此代碼執行以下操作:對於每列,它檢查列是否爲因子。如果它是一個因素,它會根據您的情況重新編碼。如果它不是一個因素,它將保持數據不變。您還可以更改提供給lapply的功能,以執行更「精細」的操作。

+1

啊,所以它是... – Gregor