dplyr summary()的惯用用法是筛选分组依据,并替换由于缺少行而导致的任何NAs

dplyr summary()的惯用用法是筛选分组依据,并替换由于缺少行而导致的任何NAs,r,idioms,na,dplyr,summarization,R,Idioms,Na,Dplyr,Summarization,我正在跨销售数据的数据框架计算一个dplyr::summary。 我按(S,D,Y)分组,然后在每个组中计算第5周到第43周的中值和均值,然后将它们合并回父df。变量X是销售。X永远不是NA(即df中任何地方都没有明确的NAs),但如果没有S、D、Y和一组周的数据(如,没有销售),df中就不会有带这些值的行(假设这意味着该特定参数组的销售为零)。换句话说,在任何结构缺失的行中输入X=0(但我希望我不需要熔化/铸造原始df,以避免膨胀。类似于铸造(填充…,添加.missing=t)或插入符号::预

我正在跨销售数据的数据框架计算一个
dplyr::summary
。 我按(S,D,Y)分组,然后在每个组中计算第5周到第43周的中值和均值,然后将它们合并回父df。变量X是销售。X永远不是NA(即df中任何地方都没有明确的NAs),但如果没有S、D、Y和一组周的数据(如,没有销售),df中就不会有带这些值的行(假设这意味着该特定参数组的销售为零)。换句话说,在任何结构缺失的行中输入X=0(但我希望我不需要
熔化/铸造原始df,以避免膨胀。类似于
铸造(填充…,添加.missing=t)
插入符号::预处理()

关于我的代码习惯用法,有两个问题:

  • 使用summary是否比使用
    dplyr::filter
    更好,因为filter实际上会删除行,所以我必须将结果分配给
    df.tmp
    ,然后左键将其连接回原始df(如下所示)?此外,在每一行汇总计算中重复的大型子集表达式使代码更难阅读。 我是否应该担心(或不担心)缓存子集操作的行或逻辑索引,在一般情况下,我可能会计算n=20个新的摘要变量

  • 不是所有的S、D、Y组和筛选器组合(在这几周内)都有行,那么如何获取摘要以替换任何缺失行上的NA?目前我做的如下

  • 抱歉,代码和数据集都是专有的,但下面是代码习惯用法,下面是生成示例数据时应首先运行的代码:

    # Compute median, mean of X across wks 5..43, for that set of S,D,Y-values
    # Issue a) filter() or repeatedly use subset() within each calculation?
    df.tmp <- df %.% group_by(S,D,Y) %.% filter(Week>=5 & Week<=43) %.%
      summarize(ysd_med543_X  = median(X),
                ysd_mean543_X = mean(X)
               ) %.% ungroup()
    
    # Issue b) how to replace NAs in groups where the group_by-and-filter gave empty output?
    # can you merge this code with the summarize above?
    df <- left_join(df, df.tmp, copy=F)
    newcols <- match(c('ysd_mean543_X','ysd_med543_X'), names(df))
    df[!complete.cases(df[,newcols]), newcols] <- c(0.0,0.0)
    
    set.seed(1234)
    
    rep_vector <- function(vv, n) {
      unlist(as.vector(lapply(vv, function(...) {rep(...,n)} )))
    }
    
    n=7
    m=3
    df = data.frame(S = rep_vector(10:12, n), D = 20:26,
                    Y = rep_vector(2005:2007, n),
                    Week = round(52*runif(m*n)),
                    X = 4e4*runif(m*n) + 1e4 )
    
    # Now drop some rows, to model structurally missing rows
    I <- sort(sample(1:nrow(df),0.6*nrow(df)))
    df = df[I,]
    
    require(dplyr)
    
    #计算该组S、D、Y值的中位数,即第5至43周X的平均值
    #问题a)过滤器()或在每次计算中重复使用子集()?
    
    df.tmp=5&Week我认为这与您在评论下链接的功能无关(因为IIUC该功能与未使用的因子级别有关)。一旦您过滤了数据,IMO
    summary
    就不应该(或者更确切地说不能)将它们包括在结果中(除了
    因子
    )。您应该在项目页面上与开发人员澄清这一点


    我决不是一个
    dplyr
    专家,但我认为,首先,最好先
    filter
    ,然后再
    groupby+summary
    。否则,您将对每个组进行筛选,这是不必要的。即:

    df.tmp <- df %.% filter(Week>=5 & Week<=43) %.% group_by(S,D,Y) %.% ...
    
    df.tmp <- df %.% group_by(S,D,Y) %.% mutate(
                 md_X = median(X[Week >=5 & Week <= 43]), 
                 mn_X = mean(X[Week >=5 & Week <= 43]))
    
    在这里,仍然存在替换NA/NaN的问题。这里没有简单/直接的方法来分配子任务。因此,您必须再次使用
    ifelse
    。但是如果
    mutate
    支持表达式,那就更好了

    我的想法是:

    df.tmp <- df %.% group_by(S,D,Y) %.% mutate(
                  { tmp = Week >= 5 & Week <= 43;
                    md_X = ifelse(length(tmp), median(X[tmp]), 0), 
                    md_Y = ifelse(length(tmp), mean(X[tmp]), 0)
                  })   
    

    df.tmp=5&周“你再也得不到任何东西了”。很抱歉,编造一些随机数据应该不难。@Arun:由于大众的需求,上面是样本数据。。。并不是说它是严格需要的。。。现在我可以期待一些答案吗?我想根本原因是。但我今天需要一个变通办法。对那些悲观的选民来说:如果你真的想惹人厌,代码来自一个实时数据科学竞赛,其规则禁止共享代码。要明确的是,我没有在这里共享任何代码,因为这个代码段经过了大量的清理。这个问题只是关于一般的dplyr习语。让两个人投反对票真的让我很恼火,但一旦我提供了样本数据,我就不必费心做任何有用的事情了。我想要的是dplyr而不是data.table,谢谢。这就是为什么它被标记为dplyr。@smci,请在评论之前阅读完整的答案。它只是帮助我在
    data.table
    中思考。我提供了一个
    dplyr
    解决方案。我已经完整阅读了整个答案。我对你的评论逐条回复。你一直对我低声下气,真让人恼火。你能改变你的态度吗?请停止假设不正确的事情。您的意思是我使用
    data.table
    来获得
    dplyr
    解决方案,您感到不高兴?许多事情似乎让你恼火。
    md_X=median(tmp*X)
    和类似的
    mean
    可以用来小幅度减少代码大小
    md_X=tmp[1L]*中值(X)
    将是另一种方法。
    df.tmp = df %.% group_by(S,D,Y) %.% mutate(tmp = Week >=5 & Week <= 43)
    df.tmp %.% mutate(md_X = ifelse(tmp[1L], median(X), 0), 
                      mn_X = ifelse(tmp[1L], mean(X), 0))
    
    df %.% group_by(S,D,Y) %.% mutate(tmp = Week >=5 & Week <= 43, 
           md_X = ifelse(tmp[1L], median(X), 0), 
           mn_X = ifelse(tmp[1L], median(X), 0)) 
    
    #     S  D    Y Week        X   tmp     md_X     mn_X
    # 1  10 20 2005    6 22107.73  TRUE 22107.73 22107.73
    # 2  10 23 2005   32 18751.98  TRUE 18751.98 18751.98
    # 3  10 25 2005   33 31027.90  TRUE 31027.90 31027.90
    # 4  10 26 2005    0 46586.33 FALSE     0.00     0.00
    # 5  11 20 2006   12 43253.80  TRUE 43253.80 43253.80
    # 6  11 22 2006   27 28243.66  TRUE 28243.66 28243.66
    # 7  11 23 2006   36 20607.47  TRUE 20607.47 20607.47
    # 8  11 24 2006   28 22186.89  TRUE 22186.89 22186.89
    # 9  11 25 2006   15 30292.27  TRUE 30292.27 30292.27
    # 10 12 20 2007   15 40386.83  TRUE 40386.83 40386.83
    # 11 12 21 2007   44 18049.92 FALSE     0.00     0.00
    # 12 12 26 2007   16 35856.24  TRUE 35856.24 35856.24