更改数据框中的列类

时间:2010-11-24 19:53:07

标签: class r

首先,如果我犯了任何错误,请原谅我,但英语不是我经常使用的语言。

我有一个带数字的数据框。数据框的一小部分是:

名义2 2 2 2

序 2 1 1 2

所以,我想对这些数字使用gower距离函数。

这里(http://rgm2.lab.nig.ac.jp/RGM2/R_man-2.9.0/library/StatMatch/man/gower.dist.html)表示为了使用gower.dist,所有名义变量必须是“factor”类,并且所有序数变量都是“order”类。

默认情况下,所有列都是“integer”类和“numeric”模式。为了更改列的类,我使用以下命令:

 DF=read.table("clipboard",header=TRUE,sep="\t")      
 # I select all the cells and I copy them to the clipboard. 
 #Then R, with this command, reads the data from there.

 MyHeader=names(DF)     # I save the headers of the data frame to a temp matrix

 for (i in 1:length(DF))  {
     if (MyHeader[[i]]=="nominal") DF[[i]]=as.factor(DF[[i]])
 }     

 for (i in 1:length(DF))  {
     if (MyHeader[[i]]=="ordinal") DF[[i]]=as.ordered(DF[[i]])
 }        

第一个for / if循环将类从integer更改为factor,这是我想要的,但第二个将序数变量类更改为:“ordered”“factor”。

我需要将标题“ordinal”的所有列更改为“ordered”,如gower.dist函数所示。

提前致谢, B.T。

2 个答案:

答案 0 :(得分:1)

你做得很好 - 如果可能有点不合时宜。

根据您的有序因素,您可以使用以下内容:

> foo <- as.ordered(1:10)
> foo
 [1] 1  2  3  4  5  6  7  8  9  10
Levels: 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10
> class(foo)
[1] "ordered" "factor" 

请注意,它有两个类,表示 有序因子,而 因子

> is.ordered(as.ordered(1:10))
[1] TRUE
> is.factor(as.ordered(1:10))
[1] TRUE

从某种意义上说,您可能认为foo是一个有序因子,但也从因子类继承。或者,如果没有处理有序因子的特定方法,但有一个因子方法,R将使用因子方法。就R而言,有序因子是具有类"ordered""factor"的对象。这就是Gower距离所需的功能。

答案 1 :(得分:1)

您可以通过以下方式轻松完成此操作:

DF$nominal <- as.factor(DF$nominal)
DF$ordinal <- as.ordered(DF$ordinal)

为您提供具有正确结构的数据框。如果您使用数据框,请远离[[]],除非您非常清楚自己在做什么。听取Dirks的建议,并检查Owen's R Guide。你肯定需要它。

如果按照上面的说明进行转换,gower.dist()的效果非常好。在旁注中,也可以使用daisy()函数轻松计算gowers距离:

DF <- data.frame(
    ordinal= c(1,2,3,1,2,1),
    nominal= c(2,2,2,2,2,2)
)
DF$nominal <- as.factor(DF$nominal)
DF$ordinal <- as.ordered(DF$ordinal)

library(cluster)
daisy(DF,metric="gower")
library(StatMatch)
gower.dist(DF)