【问题标题】:Build a proportions tree in R在 R 中构建比例树
【发布时间】:2015-08-13 17:11:46
【问题描述】:

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

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

我怎样才能做到这一点?我一直在尝试几种方法,但我有点卡住了。

提前致谢。

【问题讨论】:

    标签: r


    【解决方案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
    

    【讨论】:

    • 是的!这正是我所需要的。谢谢!现在我需要根据计数(或比例)制作一个图表,其中包含一个母节点和从它流下的叶子。我怎么能做到?我一直在浏览 igraph 包教程,但到目前为止我还没有找到满意的结果。
    • 我不确定,但我认为该函数需要稍作修改以存储有关每个级别的信息。您可能想提出一个新问题,以便人们更有可能看到这个新问题(如果您有一个您脑海中的输出图像,那就更好了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2014-05-09
    相关资源
    最近更新 更多