2017-05-25 108 views
2

我試圖執行一個主成分分析,但我得到錯誤:colMeans(x ,na.rm = TRUE):'x'必須是數字主成分分析:colMeans(x,na.rm = TRUE)中的錯誤:'x'必須是數字

我知道所有的列都必須是數字,但是如何處理數據集中的字符對象? E.g:

enter image description here

我應該添加新列指國名的數字代碼:下面的數據

data(birth.death.rates.1966) 
data2 <- birth.death.rates.1966 
princ <- prcomp(data2) 
  • 數據2的例子嗎?如果是的話,如何在R中做到這一點?

回答

3

您可以通過factor去轉換角色矢量數值。然後每個唯一的值得到一個唯一的整數代碼。在這個例子中,有四個值,因此數爲1〜4,按照字母順序,我想:

> d = data.frame(country=c("foo","bar","baz","qux"),x=runif(4),y=runif(4)) 
> d 
    country   x   y 
1  foo 0.84435112 0.7022875 
2  bar 0.01343424 0.5019794 
3  baz 0.09815888 0.5832612 
4  qux 0.18397525 0.8049514 
> d$country = as.numeric(as.factor(d$country)) 
> d 
    country   x   y 
1  3 0.84435112 0.7022875 
2  1 0.01343424 0.5019794 
3  2 0.09815888 0.5832612 
4  4 0.18397525 0.8049514 

然後,您可以運行prcomp

> prcomp(d) 
Standard deviations: 
[1] 1.308665216 0.339983614 0.009141194 

Rotation: 
       PC1   PC2   PC3 
country -0.9858920 0.132948161 -0.101694168 
x  -0.1331795 -0.991081523 -0.004541179 
y  -0.1013910 0.009066471 0.994805345 

無論你的應用是這是有道理的由你決定。也許你只想放棄第一列:prcomp(d[,-1])並使用數字數據,這似乎是其他「答案」試圖實現的內容。

1

數據幀的第一列是字符。所以,你可以重新編寫它行的名稱爲:

library(tidyverse) 
data2 %>% remove_rownames %>% column_to_rownames(var="country") 
princ <- prcomp(data2) 

或者爲:

data2 <- data2[,-1] 
rownames(data2) <- data2[,1] 
princ <- prcomp(data2) 
+3

請採取第二種選擇。反轉解決方案更長,需要更多時間。不是所有的東西都是一個釘子,要求用反轉錘擊打。保留那個用於更復雜的數據處理的地方,它確實給你帶來了好處。 –

+0

正確告訴@JorisMeys,_tidyverse_對於複雜的數據更爲合適 – parth

+1

*和*這並不回答將字符轉換爲數字的問題。 – Spacedman

相關問題