我想在R中设计一个算法,给定一个因子数据帧,它返回一个比例树,其中base是数据帧的行数(观察值)。
例如,假设我的数据框的行数是100,我有4个因素。第一个因素将观察分为两个等级,每个等级都有50%的过度。然后,下一个因子将前面的每个级别分成4个级别,依此类推其他两个因素。当然,每片叶子的比例不必相等。
我怎么能实现这一目标?我已经尝试了几种方法,但我有点卡住了。
提前致谢。
答案 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