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

平均值与tapply。唯一性(ave)==taply始终?如果是这样,为什么会有一个存在?

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

    考虑以下内容-

    set.seed(1)
    x <- runif(100)
    y <- sample(c('M', 'F', 'D'), 100, TRUE)
    aveResult <- ave(x = x, y, FUN = sum)
    tapplyResult <- tapply(x, y, sum)
    aveResult <- setNames(aveResult, y)
    tapplyResult
    aveResult[!duplicated(names(aveResult))]
    

    两个函数的结果是相同的,除了输出的长度。此外,这也会造成混乱(由于回收而加剧),如 this case .

    有没有一个例子,其中一个函数可以做另一个不能做的事情?

    2 回复  |  直到 6 年前
        1
  •  4
  •   akrun    6 年前

    ave base R mean dplyr data.table

    set.seed(24)
    df1 <- data.frame(grp = sample(LETTERS, 1e6, replace = TRUE), val = rnorm(1e6))
    system.time(with(df1, ave(val, grp)))
    #   user  system elapsed 
    #  0.070   0.004   0.073 
    
    library(dplyr)
    system.time(df1 %>%
                  group_by(grp) %>%
                  mutate(new = mean(val)))
    #   user  system elapsed 
    #  0.159   0.000   0.160 
    
    library(data.table)
    system.time(setDT(df1)[, new := mean(val), by = grp])
    #  user  system elapsed 
    #  0.056   0.000   0.057 
    

    tapply tidyverse sort unique list

    tapply(1:10, rep(LETTERS[1:3], c(3, 3, 4)), FUN = range)
    

    ave(1:10, rep(LETTERS[1:3], c(3, 3, 4)), FUN = range)
    

        2
  •  2
  •   Maurits Evers    6 年前

    by(x, y, FUN = sum)

    ave tapply by

    1. ave(x, y, FUN = sum) x y length(x)

    2. tapply(x, y, sum)

    3. by(x, y, sum)


    dplyr

    1. group_by mutate

      data.frame(x, y) %>% group_by(y) %>% mutate(x = sum(x)) %>% pull(x)
      
    2. summarise

      data.frame(x, y) %>% group_by(y) %>% summarise(x = sum(x)) %>% pull(x)
      

    vector data.frame matrix