1

当我构建以下data.frame时:

cntrydata<-as.data.frame(cbind(c('BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 
             'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'IE', 
             'IL', 'LT', 'NL', 'NO', 'PL', 'PT', 'RU', 'SE', 
             'SI', 'SK', 'UA'),c('C', 'P', 'C', 'P', 'P', 'C', 
             'C', 'C', 'C', 'C', 'C', 'C', 'P', 'P', 'P', 'C',
             'P', 'P', 'C', 'C', 'P', 'C', 'P', 'C', 'P', 'P', 'P'),
              c(7.1, 3.6, 8.7, 6.3, 4.6, 7.9, 9.3, 6.5, 
                6.1, 9.1, 6.8, 7.6, 3.5, 4.1, 4.7, 8, 6.1, 5, 8.8,
                8.6, 5.3, 6, 2.1, 9.2, 6.4, 4.3, 2.4)))
colnames(cntrydata)<-c('cntry','mode','CPI')

CPI 变量属于class(factor),而我需要它是数字才能使以下函数起作用:

boxplot(CPI~mode, data=cntrydata)

我尝试了以下方法:

as.numeric(levels(cntrydata$CPI))[cntrydata$CPI]

正如有关如何在不丢失信息的情况下将因子转换为整数\数字的建议?

但它仍然是阶级因素。任何想法如何达到我的目标?

此外,但不太重要的是,我正在研究如何将colnames参数包含在数据构造命令中(而不是之后,就像我最终所做的那样)。但找不到如何以及在哪里放置它?

4

3 回答 3

2

以下将进行转换:

cntrydata$CPI <- as.numeric(as.character(cntrydata$CPI))

如果您要按如下方式构建数据框,则不会遇到问题,并且还会获得列名:

> cntrydata <- data.frame(cntry=c('BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 
+              'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'IE', 
+              'IL', 'LT', 'NL', 'NO', 'PL', 'PT', 'RU', 'SE', 
+              'SI', 'SK', 'UA'), mode=c('C', 'P', 'C', 'P', 'P', 'C', 
+              'C', 'C', 'C', 'C', 'C', 'C', 'P', 'P', 'P', 'C',
+              'P', 'P', 'C', 'C', 'P', 'C', 'P', 'C', 'P', 'P', 'P'),
+               CPI=c(7.1, 3.6, 8.7, 6.3, 4.6, 7.9, 9.3, 6.5, 
+                 6.1, 9.1, 6.8, 7.6, 3.5, 4.1, 4.7, 8, 6.1, 5, 8.8,
+                 8.6, 5.3, 6, 2.1, 9.2, 6.4, 4.3, 2.4))
于 2013-04-01T16:03:44.280 回答
2

您的主要问题是您创建data.frame. 不要使用cbindas.data.frame。试试这个:

cntrydata <- data.frame( cntry = c('BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 
         'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'IE', 
         'IL', 'LT', 'NL', 'NO', 'PL', 'PT', 'RU', 'SE', 
         'SI', 'SK', 'UA'), mode = c('C', 'P', 'C', 'P', 'P', 'C', 
         'C', 'C', 'C', 'C', 'C', 'C', 'P', 'P', 'P', 'C',
         'P', 'P', 'C', 'C', 'P', 'C', 'P', 'C', 'P', 'P', 'P'),
          CPI = c(7.1, 3.6, 8.7, 6.3, 4.6, 7.9, 9.3, 6.5, 
            6.1, 9.1, 6.8, 7.6, 3.5, 4.1, 4.7, 8, 6.1, 5, 8.8,
            8.6, 5.3, 6, 2.1, 9.2, 6.4, 4.3, 2.4))

sapply(cntrydata, class)
#     cntry      mode       CPI 
#  "factor"  "factor" "numeric" 

这是因为,当您使用 时cbind,它的至少一个参数必须是 adata.frame才能使您的数据成为data.frame。如果不是,结果将是matrix. 在 a 中matrix,所有数据都应该属于同一类。并且由于您的数据的一列或多列是character类型,因此数字列也被强制转换为character数据。

于 2013-04-01T16:06:19.167 回答
0

你需要先as.character() 使用as.numeric

原因是factors 实际上是带有键值标签的整数。
如果您简单地使用as.numeric(someFactor),您将获得等效的密钥。
你想要等价的值,你可以通过as.character.
但是你希望你的最终结果是数字的,因此你把它包装在一起:

 as.numeric(as.character(someFactor))

比较:

 > as.numeric(cntrydata$CPI)
  [1] 17  4 22 13  7 19 26 15 12 24 16 18  3  5  8 20 12  9 23 21 10 11  1 25 14  6  2

 > as.numeric(as.character(cntrydata$CPI))
  [1] 7.1 3.6 8.7 6.3 4.6 7.9 9.3 6.5 6.1 9.1 6.8 7.6 3.5 4.1 4.7 8.0 6.1 5.0 8.8 8.6
 [21] 5.3 6.0 2.1 9.2 6.4 4.3 2.4
于 2013-04-01T16:04:08.187 回答