【发布时间】:2015-08-13 17:11:46
【问题描述】:
我想在 R 中设计一个算法,给定一个因子数据框,它返回一个比例树,其中基数是数据框的行数(观察值)。
例如,假设我的数据框的行数是 100,我有 4 个因子。第一个因素将观测值分成两个级别,每个级别都有 50% 的观测值。然后,下一个因素将之前的每个级别分成 4 个级别,以此类推其他两个因素。当然,每片叶子的比例不必相等。
我怎样才能做到这一点?我一直在尝试几种方法,但我有点卡住了。
提前致谢。
【问题讨论】:
标签: r
我想在 R 中设计一个算法,给定一个因子数据框,它返回一个比例树,其中基数是数据框的行数(观察值)。
例如,假设我的数据框的行数是 100,我有 4 个因子。第一个因素将观测值分成两个级别,每个级别都有 50% 的观测值。然后,下一个因素将之前的每个级别分成 4 个级别,以此类推其他两个因素。当然,每片叶子的比例不必相等。
我怎样才能做到这一点?我一直在尝试几种方法,但我有点卡住了。
提前致谢。
【问题讨论】:
标签: r
我不确定输出到底应该是什么,但这个问题对我来说似乎是递归的,所以这里是一种递归方法。假设您有一个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
【讨论】: