我有所有因子的數據幀值如何將因子的數據框轉換爲數字?
V1 V2 V3
a b c
c b a
c b c
b b a
如何可以轉換所有的值在數據幀到一個新的使用數值(a至1,B 2,C 3,等...)
我有所有因子的數據幀值如何將因子的數據框轉換爲數字?
V1 V2 V3
a b c
c b a
c b c
b b a
如何可以轉換所有的值在數據幀到一個新的使用數值(a至1,B 2,C 3,等...)
從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])))
}
我會嘗試:
> 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
你能解釋爲什麼一個簡單的'應用(mydf,2,as.numeric)'不起作用嗎? –
@AlbertMasclans,閱讀「apply」的「details」部分的第一行。 'apply'首先在'data.frame'上做'as.matrix'(它將把所有東西都轉換成''字符)。如果你直接在'character'上使用'as.numeric',你最終會得到一堆'NA'值。 – A5C1D2H2I1M1N2O1R2T1
這種方法類似於阿難的,但使用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))
我很好奇:如何DF1 [] < - ...從DF1 <迥異-...我認爲它們會導致同樣的結果到底,但也許通過不同的路徑? – atiretoo
@atiretoo它保留了原始數據集中的結構。 – akrun
啊哈!謝謝是的,特別是df1仍然是一個數據幀 – atiretoo