2016-01-01 70 views

回答

9

factor轉換爲numeric給出了整數值。但是,如果factor列的級別指定爲c('b', 'a', 'c', 'd')c('c', 'b', 'a'),則整數值將按該順序排列。只是爲了避免這種情況,我們可以通過再次調用factor指定levels(更安全)

df1[] <- lapply(df1, function(x) 
       as.numeric(factor(x, levels=letters[1:3]))) 

如果我們使用data.table,一種選擇是使用set。這對於大型數據集來說會更有效率。轉換爲matrix可能會造成內存問題。

library(data.table) 
setDT(df1) 
for(j in seq_along(df1)){ 
set(df1, i=NULL, j=j, 
    value= as.numeric(factor(df1[[j]], levels= letters[1:3]))) 
} 
+0

我很好奇:如何DF1 [] < - ...從DF1 <迥異-...我認爲它們會導致同樣的結果到底,但也許通過不同的路徑? – atiretoo

+0

@atiretoo它保留了原始數據集中的結構。 – akrun

+1

啊哈!謝謝是的,特別是df1仍然是一個數據幀 – atiretoo

11

我會嘗試:

> mydf[] <- as.numeric(factor(as.matrix(mydf))) 
> mydf 
    V1 V2 V3 
1 1 2 3 
2 3 2 1 
3 3 2 3 
4 2 2 1 
+0

你能解釋爲什麼一個簡單的'應用(mydf,2,as.numeric)'不起作用嗎? –

+0

@AlbertMasclans,閱讀「apply」的「details」部分的第一行。 'apply'首先在'data.frame'上做'as.matrix'(它將把所有東西都轉換成''字符)。如果你直接在'character'上使用'as.numeric',你最終會得到一堆'NA'值。 – A5C1D2H2I1M1N2O1R2T1

5

這種方法類似於阿難的,但使用unlist(),而不是factor(as.matrix())。由於所有列都已經是因素,所以unlist()將它們組合成具有適當級別的一個因子向量。

那麼讓我們來看看當我們的數據框爲unlist()時會發生什麼。現在

unlist(df, use.names = FALSE) 
# [1] a c c b b b b b c a c a 
# Levels: a b c 

我們可以簡單地運行於上述代碼as.integer()(或c()),因爲各因素的整數值匹配所需的映射。因此,以下內容將重新評估您的整個數據框。

df[] <- as.integer(unlist(df, use.names = FALSE)) 
## note that you can also just drop the factor class with c() 
## df[] <- c(unlist(df, use.names = FALSE)) 
df 
# V1 V2 V3 
# 1 1 2 3 
# 2 3 2 1 
# 3 3 2 3 
# 4 2 2 1 

注:use.names = FALSE是沒有必要的。但是,刪除名稱屬性將使此過程更有效。

數據:

df <- structure(list(V1 = structure(c(1L, 3L, 3L, 2L), .Label = c("a", 
"b", "c"), class = "factor"), V2 = structure(c(1L, 1L, 1L, 1L 
), .Label = "b", class = "factor"), V3 = structure(c(2L, 1L, 
2L, 1L), .Label = c("a", "c"), class = "factor")), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -4L)) 
相關問題