2017-05-25 88 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

相关问题