首先,如果我犯了任何错误,请原谅我,但英语不是我经常使用的语言。
我有一个带数字的数据框。数据框的一小部分是:
名义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。
答案 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)