在R中构建一个比例树

时间:2015-08-13 17:11:46

标签: r

我想在R中设计一个算法,给定一个因子数据帧,它返回一个比例树,其中base是数据帧的行数(观察值)。

例如,假设我的数据框的行数是100,我有4个因素。第一个因素将观察分为两个等级,每个等级都有50%的过度。然后,下一个因子将前面的每个级别分成4个级别,依此类推其他两个因素。当然,每片叶子的比例不必相等。

我怎么能实现这一目标?我已经尝试了几种方法,但我有点卡住了。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我不确定输出应该是什么,但这个问题似乎是递归的,所以这是一个递归方法。假设您有data.frame个因素,并且您希望按从左到右的每列中的因子拆分数据。这个功能会做到这一点,产生一个"叶子列表"对应于最后一列中的数据,按前几列中各种因子分组进行划分。

## Sample data
set.seed(0)
dat <- setNames(data.frame(matrix(sample(0:1, 75, rep=T), 25, 3)),
                paste0("f", 1:3))
dat[] <- lapply(dat, as.factor)

f <- function(data) {
    if (NCOL(data) < 2L) return( split(data, data) )
    lapply(split(data[,-1L], data[,1L]), f)
}

## Apply function
res <- f(dat)

## Proportions at each leaf
## The naming is: column1.column2.column3. etc.
rapply(res, function(x) length(x)/nrow(dat))
# 0.0.0 0.0.1 0.1.0 0.1.1 1.0.0 1.0.1 1.1.0 1.1.1 
#  0.08  0.08  0.24  0.04  0.16  0.16  0.16  0.08 

## Counts
rapply(res, function(x) length(x))
# 0.0.0 0.0.1 0.1.0 0.1.1 1.0.0 1.0.1 1.1.0 1.1.1 
#     2     2     6     1     4     4     4     2 

## For example, the data corresponding to 1.1.0,
with(dat, dat[f1==1 & f2==1 & f3==0,])
#    f1 f2 f3
# 5   1  1  0
# 8   1  1  0
# 18  1  1  0
# 22  1  1  0