当我构建以下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]
正如How to convert a factor to an integer\numeric without a loss of information?
所述但它仍然是阶级因素。任何想法如何实现我的目标?
此外,但不太重要的是,我正在寻找如何在数据构造命令中包含colnames
参数(而不是之后,正如我最终所做的那样)。但无法找到如何以及在哪里放置它?
答案 0 :(得分: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))
答案 1 :(得分:2)
您的主要问题是您创建data.frame
的方式。请勿使用cbind
和as.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
时,至少有一个参数必须是data.frame
才能使您的数据成为data.frame
。如果不是,则结果为matrix
。在matrix
中,所有数据都应该属于同一个类。由于您的数据的一列或多列属于character
类型,因此数字列也会强制转换为character
数据。
答案 2 :(得分:0)
您需要在as.character()
as.numeric
原因是factor
实际上是带有键值标签的整数
如果您只使用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