【问题标题】:Using aggregate with variable names for column names使用带有变量名的聚合作为列名
【发布时间】:2014-12-01 18:47:11
【问题描述】:

我有以下数据框:

a <- c(1,1,4)
b <- c(1,0,2)
c <- data.frame(a=a,b=b)
str(c)
#  a  b
#1 1  1
#2 1  0
#3 4  2

我想通过以下方式聚合数据框c:

aggregate(b~a,FUN=mean,data=c)
#  a   b
#1 1 0.5
#2 4 2.0

但是,我的主要问题是我将使用一个变量作为列名

所以:

d <- 'a'

如果我尝试使用包含列名称的变量 d 进行聚合,我显然会得到一个错误:

aggregate(b~d,FUN=mean,data=c)
#Error in model.frame.default(formula = b ~ d, data = c) : variable lengths differ (found for 'd')

这可行,但我得到了愚蠢的列名。我想避免重命名列的额外步骤:

aggregate(c[,'b']~c[,d],FUN=mean,data=c)
#  c[, d] c[, "b"]
#1    1      0.5
#2    4      2.0

如何在第一次尝试聚合并获得正确的列名? (也许没有办法做到这一点)

【问题讨论】:

    标签: r dataframe aggregate


    【解决方案1】:

    你可以试试

    aggregate(c['b'], c[d], FUN=mean)
    #   a   b
    # 1 1 0.5
    # 2 4 2.0
    

    如果您使用formula 方法,另一个选择是使用setNames

     setNames(aggregate(b~get(d), FUN=mean, data=c), colnames(c))
     #  a   b
     #1 1 0.5
     #2 4 2.0
    

    【讨论】:

    • 我想知道为什么这会产生与我使用的不同的列名。
    • @Michal 你使用的是formula方法,即aggregate.formula,而我使用的是aggregate.data.frame 你可以查看stats:::aggregate.formulaaggregate.data.frame的源代码
    【解决方案2】:

    如果您不喜欢 base R 中的 aggregate(...),这里有一个 data.table 解决方案。

    library(data.table)
    setDT(c)[,list(b=mean(b)),by=d,with=TRUE]
    #    a   b
    # 1: 1 0.5
    # 2: 4 2.0
    

    【讨论】:

      【解决方案3】:

      您可以使用cbind 设置aggregate 中的名称。此方法还表明您可以省略 data 参数。因此,如果我们使用您的原始计划,您可以这样做

      aggregate(cbind(b = c[, "b"]) ~ cbind(a = c[, "a"]), FUN = mean)
      #   a   b
      # 1 1 0.5
      # 2 4 2.0
      

      【讨论】:

      • 这个也不好用,因为你有 cbind(a = c[, "a"])。该语句中的第一个 a 是固定的,不能被变量替换。
      • 好的,您可以使用get("d") 代替"a"。但可能比这更安全的是substitute(x, list(x = d))
      【解决方案4】:

      我解决这个问题的方法是在粘贴中构造公式参数:

      aggregate(formula(paste0("b ~ ", d)), data = c, FUN = mean)
      

      通过这种方式,您可以轻松地将尽可能多的列名变量传递给所需的复杂公式。

      【讨论】:

        猜你喜欢
        • 2020-08-25
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多