R中的回归树

15

我在使用R制作回归树时遇到了困难。我有一个包含17个属性的数据框。

library(rpart)
rt.model <- rpart(razlika ~ ., learn)

我遇到了一个错误:

Error in `[.data.frame`(frame, predictors) : undefined columns selected

看起来很奇怪,因为我使用了一个非常相似的数据库,做了类似的事情。您可以在http://uploading.com/files/de8a966d/exa.Rda/上下载数据框,然后使用以下方式加载:

load("exa.Rda")
3个回答

20

问题并不在于你有一个矩阵而不是数据框,当我下载并加载你的数据集时,我得到了一个数据框而不是矩阵。

问题在于列名称中存在不良字符。使用gsub从列名称中删除字符“-”,“ ”,“(”和“)”。或者您可以使用colnames完全重新定义列名称。

或像ulvund那样,只需调用data.frame,它会默认强制R为您进行列名清理。

当我这样做时,rpart运行得很好。


1
make.names 函数可以用于将字符向量转换为语法上有效的变量名。 - Alex

4
将您的学习矩阵转换为数据框。
示例:
load("exa.Rda")
library(rpart)
learn <- data.frame(learn)
rt.model <- rpart(razlika ~ ., learn)
rt.model

yields:

n= 226 

node), split, n, deviance, yval
      * denotes terminal node

  1) root 226 31417.5100   3.3849560  
    2) B.reb>=40.80799 117 12661.2300   0.4871795  
      4) B.ft>=0.7666193 31  2685.4190  -5.7741940  
        8) A.fg2< 0.4645683 22  1846.7730  -8.3181820  
         16) A.ft< 0.7464692 7   365.4286 -14.2857100 *
         17) A.ft>=0.7464692 15  1115.7330  -5.5333330 *
        9) A.fg2>=0.4645683 9   348.2222   0.4444444 *
      5) B.ft< 0.7666193 86  8322.3720   2.7441860  
       10) B.avg.conceded.< 98.19592 76  7255.6320   1.7105260  
         20) A.reb< 39.29941 19  1520.6320  -3.5789470 *
         21) A.reb>=39.29941 57  5026.2110   3.4736840  
           42) A.3pt< 0.3945418 35  2500.1710   0.7714286  
             84) A.ft< 0.7460665 17  1270.2350  -2.4705880 *
             85) A.ft>=0.7460665 18   882.5000   3.8333330 *
           43) A.3pt>=0.3945418 22  1863.8640   7.7727270  
             86) B.ft>=0.7214165 13   718.9231   4.0769230 *
             87) B.ft< 0.7214165 9   710.8889  13.1111100 *
       11) B.avg.conceded.>=98.19592 10   368.4000  10.6000000 *
    3) B.reb< 40.80799 109 16719.2500   6.4954130  
      6) A.fouls>=24.51786 23  2349.9130  -2.2173910  
       12) A.fg2< 0.4551468 16  1266.0000  -5.5000000 *
       13) A.fg2>=0.4551468 7   517.4286   5.2857140 *
      7) A.fouls< 24.51786 86 12156.3800   8.8255810  
       14) B.fouls< 22.80863 24  3271.9580   2.5416670  
         28) A.3pt< 0.3738479 9   626.0000  -6.0000000 *
         29) A.3pt>=0.3738479 15  1595.3330   7.6666670 *
       15) B.fouls>=22.80863 62  7569.8710  11.2580600  
         30) A.fouls< 22.32999 18  1650.5000   5.5000000 *
         31) A.fouls>=22.32999 44  5078.4320  13.6136400  
           62) A.ft.drawn>=29.18849 7   208.8571   3.8571430 *
           63) A.ft.drawn< 29.18849 37  4077.1890  15.4594600  
            126) A.fg2< 0.4588535 18  1696.5000  11.5000000 *
            127) A.fg2>=0.4588535 19  1831.1580  19.2105300 *

2
这个方法有效的原因并不是因为learn是一个数据框,而是因为列名中有一些丑陋的字符。调用data.frame命令会强制R默认清理列名。如果你仔细看,你会发现原始数据框中的列名并没有所有这些"."。 - joran

2

如果列名是整数(1:N),即使它们存储为字符,也可能发生这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接