2017-08-04 30 views
0

當我將as.numeric和as.integer應用於列時,它會更改這些值。爲什麼是這樣?例如:as.numeric將實際值更改爲最初是因素的數據。

test <- data.frame(structure(c("52053,34", "79032,83", "20679,06", "20799,56", "20679,06", 
     "21279,45", "51789,44", "54189,45", "73138,89", "73138,89"), .Dim = c(10L, 
                       1L))) 
names(test)[names(test) == "structure.c..52053.34....79032.83....20679.06....20799.56....20679.06..."] <- "column" 

test$b <- as.numeric(test$column) 
test$c <- as.integer(test$column) 

回答

1

test$column是一個因素。

class(test$column) 
## [1] "factor" 

levels(test$column)顯示因子水平的標籤。

levels(test$column) 
## [1] "20679,06" "20799,56" "21279,45" "51789,44" "52053,34" "54189,45" "73138,89" 
## [8] "79032,83" 

實際的數據值是整數:5,8,1等

unclass(test$column) 
## [1] 5 8 1 2 1 3 4 6 7 7 
## attr(,"levels") 
## [1] "20679,06" "20799,56" "21279,45" "51789,44" "52053,34" "54189,45" "73138,89" 
## [8] "79032,83" 

test$column第一個元素由整數5表示的,因爲它是第五級。縱觀水平向量,我們看到的是,5級的標籤是

levels(test$column)[5] 
## [1] "52053,34" 

一般情況下,我們希望得到每個對應元素的標籤,將每個那些以數字:

as.numeric(sub(",", ".", levels(test$column))[test$column]) 
## [1] 52053.34 79032.83 20679.06 20799.56 20679.06 21279.45 51789.44 54189.45 
## [9] 73138.89 73138.89 

或者試試這個較短的版本:

as.numeric(sub(",", ".", test$column)) 
## [1] 52053.34 79032.83 20679.06 20799.56 20679.06 21279.45 51789.44 54189.45 
## [9] 73138.89 73138.89 

如果數字被擺在首位(而不是逗號)用小數點代表那麼這個就已經足夠了,其中x是這樣的AF演員:

as.numeric(as.character(x)) 
+0

哇謝謝!這是一個很好的解釋:) –

+0

這是令人困惑的「水平(測試$列)顯示的因素水平的標籤。」當然水平(測試$列)返回水平和標籤(測試$列)返回標籤? –

+0

@steve,根據R使用的命名法,實際上只有用於表示因素的內部整數以及用於放棄因子時可以使用的字符串,並且可以使用「levels」函數來提取。一個因素由內部使用整數1,2等表示的數據部分和levels屬性組成。沒有其他屬性。如果'fac'是一個因子,那麼'attr(fac,「levels」)和'levels(fac)'都會給出一個唯一值的字符串。 –

相關問題