首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历CHAID树R-需要按实例数排序

遍历CHAID树R-需要按实例数排序
EN

Stack Overflow用户
提问于 2016-05-20 16:29:56
回答 2查看 104关注 0票数 2

我有一些树,打印时它们有7页长。我必须重新平衡数据,并需要查看频率最高的分支,看看它们是否有意义-我需要确定不同集群的消除率。

考虑到数据如此之长,我需要的是拥有最大的分支,然后我可以验证这些分支,而不是手动地遍历210个分支。我将有许多树,因此需要自动化这一点,以查看重要的结果。

要使用的示例代码:

代码语言:javascript
复制
library(CHAID)
updatecars<-mtcars
updatecars$cyl<-as.factor(updatecars$cyl)
updatecars$vs<-as.factor(updatecars$vs)
updatecars$am<-as.factor(updatecars$am)
updatecars$gear<-as.factor(updatecars$gear)
plot(carsChaid)

carsChaid<-chaid(am~  cyl+vs+gear, data=updatecars)
carsChaid

当您打印此数据时,您将看到第一组的n=15。我需要一个表,我可以对这个值进行排序。

我需要的是一个决策树表,其中包含树中每个组中的变量值和数字。这与这个答案Walk a tree不完全相同,因为它没有给出里面的数字,但我认为它是在方向上。

有人能帮上忙吗,

谢谢,

詹姆斯

EN

回答 2

Stack Overflow用户

发布于 2016-05-20 20:27:49

当然,有一种更好的方法可以做到这一点,但这个works.Obviously愿意提出更正和改进建议。

我遇到的特别麻烦是创建所有组合的列表。当expand.grid超过3倍时,它将停止工作。所以我不得不在它上面构建一个循环来创建完整的列表。

代码语言:javascript
复制
All_canx_rates<-function(Var1,Var2,Var3,Var4,Var5,nametree){
  df1<-data.frame("CanxRate"=0,"Num_Canx"=0,"Num_Cust"=0)
  pars<-as.list(match.call()[-1])
  a<-eval(pars$nametree)[,as.character(pars$Var1)]
  b<-eval(pars$nametree)[,as.character(pars$Var2)]
  c<-eval(pars$nametree)[,as.character(pars$Var3)]
  d<-eval(pars$nametree)[,as.character(pars$Var4)]
  e<-eval(pars$nametree)[,as.character(pars$Var5)]

  allcombos<-expand.grid(levels(a),levels(b),levels(c))
  clean<- allcombos
  allcombos$Var4<-d[1]

  for (i in 2:length(levels(d))) {
    clean$Var4<-levels(d)[i]  
    allcombos<-rbind(allcombos,clean)
  }

  #define a forloop
  for (i in 1:nrow(allcombos)) {
    #define values
    f1<-allcombos[i,1]
    f2<-allcombos[i,2]
    f3<-allcombos[i,3]
    f4<-allcombos[i,4]

  y5<-nrow(nametree[(a %in% f1 & b %in% f2 & c %in% f3 & d %in% f4 & 
                       e =='1'),])
  y4<-nrow(nametree[(a %in% f1 & b %in% f2 & c %in% f3 & d %in% f4),])
  df2<-data.frame("CanxRate"=y5/y4,"Num_Canx"=y5,"Num_Cust"=y4)
  df1<-rbind(df1, df2)

  }
  #endforloop
  #make the dataframe available for global viewing
  df1<-df1[-1,]
  output<<-cbind(allcombos,df1)
  }
票数 0
EN

Stack Overflow用户

发布于 2016-05-22 18:42:50

您可以使用data.tree对party对象进行进一步的操作,如排序、遍历树、自定义绘图等。github的最新版本v0.3.7提供了从party类对象的转换:

代码语言:javascript
复制
devtools::install_github("gluc/data.tree@v0.3.7")
library(data.tree)
tree <- as.Node(carsChaid)

tree$fieldsAll

最后一个命令显示party类的已转换字段的名称:

代码语言:javascript
复制
[1] "data"        "fitted"      "nodeinfo"    "partyinfo"   "split"       "splitlevels" "splitname"   "terms"       "splitLevel" 

您可以按函数排序,例如每个节点上的数据行:

代码语言:javascript
复制
tree$Sort(attribute = function(node) nrow(node$data), decreasing = TRUE)

print(tree, 
      "splitname",
      count = function(node) nrow(node$data), 
      "splitLevel")

例如,如下所示:

代码语言:javascript
复制
  levelName splitname count splitLevel
1     1          gear    32           
2      ¦--3              17       4, 5
3      °--2              15          3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37341740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档