代码之家  ›  专栏  ›  技术社区  ›  Yollanda Beetroot

通过应用多列函数聚合表

  •  2
  • Yollanda Beetroot  · 技术社区  · 6 年前

    df x1 x2 注意到数值测量 y1 y2 y3

    df <- data.frame(x1=sample(letters[1:3], 20, replace=TRUE),
               x2=sample(letters[4:6], 20, replace=TRUE),
               y1=rnorm(20), y2=rnorm(20), y3=rnorm(20))
    

    y x 是一个包含3列的表,该表应输出一个新列:

    f <- function(y){   sum((y[,1] - y[,2]) / y[,3]) }
    

    aggregate ,请 dplyr summarizeBy

    aggregate(data = df, y1 + y2 + y3 ~ x1 + x2, FUN = f)
    

    为了澄清这一点,预期结果可以通过以下方式获得:

    groups <- unique(df[,c("x1", "x2")]) # coocurences of explanatory variables
    res <- c()
    for (i in 1:nrow(groups)){ # get the subtables
      temp <- df[df$x1 == groups[i,1] & df$x2 == groups[i,2], c("y1", "y2", "y3")]
      res <- c(res, f(temp)) # apply function on subtables
    }
    groups$res <- res # aggregate results
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jaap    6 年前

    问题出在函数的输入端。按照您指定的方式,它需要一个数据帧。

    f <- function(y) sum((y[[1]] - y[[2]]) / y[[3]]) 
    

    你现在可以在 dplyr

    df %>% 
      group_by(x1, x2) %>% 
      summarise(sum_y = f(list(y1, y2, y3)))
    

    # A tibble: 9 x 3
    # Groups:   x1 [?]
      x1    x2     sum_y
      <fct> <fct>  <dbl>
    1 a     d      1.20 
    2 a     e      0.457
    3 a     f     -9.46 
    4 b     d     -1.11 
    5 b     e     -0.176
    6 b     f     -1.34 
    7 c     d     -0.994
    8 c     e      3.38 
    9 c     f     -2.63