代码之家  ›  专栏  ›  技术社区  ›  drmariod

访问dpylr中的分组子集

  •  2
  • drmariod  · 技术社区  · 6 年前

    我觉得这已经被问了好几次了,但我不能让它在我的情况下运行。不知道为什么。

    group_by 我的数据框架和计算 mean 从值开始。另外,我标记了一个特定的行,我想计算新计算的比率 意思是 使用子集中突出显示的行的值。

    library(dplyr)
    df <- data.frame(int=c(5:1,4:1),
                     highlight=c(T,F,F,F,F,F,T,F,F),
                     exp=c('a','a','a','a','a','b','b','b','b'))
    
    df %>%
      group_by(exp) %>%
      summarise(mean=mean(int),
                l1=nrow(.),
                ratio_mean=.[.$highlight, 'int']/mean)
    

    但出于某种原因, . 不是的子集 分组依据 但完整的输入。我是不是错过了什么?

    我的预期产出是

    exp    mean ratio_mean
      <fct> <dbl>      <dbl>
    1 a       3         1.67
    2 b       2.5       1.2
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   kath    6 年前

    这项工作:

    df %>%
      group_by(exp) %>%
      summarise(mean = mean(int),
                l1 = n(),
                ratio_mean = int[highlight] / mean)
    

    但是你的解决方案出了什么问题?

    • nrow(.) 计算整个输入数据帧的行数,wherase n() 每组只计算行数
    • .[.$highlight, 'int']/mean 这里再次使用Highlight列来使用整个输入数据帧和子集,但是它被正确的组平均值所除。实际上,在这里返回两个值,作为原始df的两行 highlight = TRUE . 这会导致 NA -列名称。

    为了保存它,我们可以使用 do() 正如@mikkomarttila所建议的,但这有点笨拙:

    df %>% 
      group_by(exp) %>% 
      do(summarise(., mean = mean(.$int),
                   l1 = nrow(.),
                   ratio_mean = .$int[.$highlight] / mean))
    

    原始输出

    df %>%
      group_by(exp) %>%
      summarise(mean=mean(int),
                l1=nrow(.),
                ratio_mean=.[.$highlight, 'int']/mean)
    
    # A tibble: 2 x 4
    #   exp    mean    l1 ratio_mean$    NA
    #   <fct> <dbl> <int>       <dbl> <dbl>
    # 1 a       3       9        1.67   2  
    # 2 b       2.5     9        1      1.2