【问题标题】:Aggregate in R with parameter list使用参数列表在 R 中聚合
【发布时间】:2016-08-26 12:47:50
【问题描述】:

我对 R 很陌生,对如何解决以下问题一无所知:(

我的数据集“测试”如下所示

A  B  C  y     z
a1 b1 c1 0.10  0
a1 b1 c2 0.01  1
a1 b2 c1 0.20  1
a1 b2 c2 0.10  0
a2 b1 c1 0.10  0
a2 b1 c2 0.01  1
a2 b2 c1 0.20  0
a2 b2 c2 0.30  1

我想通过两个维度“A”和“B”的一些“y”值来聚合我的数据集,这可以通过

> aggregate(x = test$y, by = list(test$A, test$B), FUN=sum)

并返回正确的结果:

Group.1 Group.2 x
   a1      b1   1
   a2      b1   1
   a1      b2   1
   a2      b2   1

到目前为止,一切都很好。在这个简单的例子中,我可以显式地编写列名,但是如果我想参数化它们怎么办?有点像

 > fields = 'test$A, test$B'
 > aggregate(x = test$aL, by = list(.(fields)), FUN=sum)

它会抛出参数必须具有相同长度的错误。 那么如何参数化聚合列表呢?我将非常感谢任何提示。

【问题讨论】:

  • 为什么不是fields <- list(test$A, test$B),然后是aggregate(..., by = fields,..)
  • 另一种方法,fields <- c("A", "B"); aggregate(test$y, test[fields], FUN=sum)

标签: r list parameter-passing aggregate


【解决方案1】:

一种方法是让fields 包含您的变量的列表,即

fields <- list(test$A, test$B)
aggregate(test$y, by = fields, FUN=sum)

或者创建一个函数,

fun1 <- function(v1, v2){aggregate(test$y, by = list(v1, v2), FUN = sum)}
fun1(test$A, test$B)

【讨论】:

    【解决方案2】:

    除了 cmets 中基于 aggregate 的选项外,一些有效方法的语法(例如 data.tabledplyr)如下所示。

    我们将'data.frame'转换为'data.table'(setDT(test)),按'fields'分组,得到'y'的sum

    library(data.table)
    fields <- c("A", "B")
    setDT(test)[, .(y = sum(y)), by = fields]
    #    A  B    y
    #1: a1 b1 0.11
    #2: a1 b2 0.30
    #3: a2 b1 0.11
    #4: a2 b2 0.50
    

    或者使用dplyr,我们可以通过.dots参数传递group_by_中的对象,得到'y'的sum

    library(dplyr)
    test %>% 
        group_by_(.dots = fields) %>% 
        summarise(y = sum(y))
    #    A     B     y
    #  <chr> <chr> <dbl>
    #1    a1    b1  0.11
    #2    a1    b2  0.30
    #3    a2    b1  0.11
    #4    a2    b2  0.50
    

    【讨论】:

    • .dots 参数有什么作用?
    • @CyrusMohammadian 你可以阅读 NSE 的 dplyr vignettehere
    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2021-12-02
    • 2015-06-28
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多