【问题标题】:What is the meaning of ~ in aggregate?~总之是什么意思?
【发布时间】:2013-03-30 00:18:22
【问题描述】:
x <- iris[,1:4]
names(x) <- c("x1","x2","x3","x4")
aggregate(x1+x2+x3+x4~x1,FUN=sum,data=x)

这是输出,我想知道
1、公式中~是什么意思?
2.为什么x1 = 4.3x1 + x2 + x3 + x4是8.5?

x1 x1 + x2 + x3 + x4
1 4.3 8.5
2 4.4 26.9
3 4.5 8.4

当我使用时

 transform(x,x1=sort(x1))

我得到的是:

     x1  x2  x3  x4  
1   4.3 3.5 1.4 0.2  
2   4.4 3.0 1.4 0.2  
3   4.4 3.2 1.3 0.2  
4   4.4 3.1 1.5 0.2  

(很多输出省略)
x1=4.3 时,x1 + x2 + x3 + x4 不是3.5+1.4+0.2=5.1,也不是4.3+3.5+1.4+0.2=9.4

【问题讨论】:

  • 您还应该问+ 在公式中做了什么,因为虽然它意味着一个总和,但它并不是您所想的那样一个总和。要获得变量的实际总和,您可以编写 I(x1+x2+x3+x4)。见?formula

标签: r


【解决方案1】:

~ in aggregate() 将左侧“聚合”的内容和右侧用于“聚合”项目的内容分开。

在您的示例中,将针对每一行计算x1 + x2 + x3 + x4 的结果,然后根据tuples 组成的组求和,其中x1 出现相同的值。

所以,你之所以有8.5 是因为,被求和的数据是:

x1 + x2 + x3 + x4 = sum(c(4.3, 3.0, 1.1, 0.1)) = 8.5

在您的示例中,x1 = 4.3 所在的行是第 14 行:14 4.3 3.0 1.1 0.1

所有的值都相加,每个结果的和都由x1值聚合,并发送到FUN=sum进行求和。

由于只有一个x1 = 4.3,因此值将只是8.5,这是第14行条目总和的结果。

【讨论】:

    【解决方案2】:

    tilde operator 创建一个符号公式。这是blog post 的摘录,它比我能更好地解释它:

    f = 价格 ~ 克拉

    [...]

    我们首先使用看起来很奇怪的波浪号运算符创建公式 f。这告诉 R 解释器我们正在定义一个符号公式,而不是一个要立即计算的表达式。所以,我们对公式 f 的定义说,“价格是克拉的函数”。

    formulas 上的手册页对波浪号运算符有更多说明。

    【讨论】:

      【解决方案3】:

      关于您的第二个问题,在 Iris 数据集中,只有一行第一列是 4.3。那一行是:

      (x[x[,1]==4.3,])
      
      #     x1 x2  x3  x4
      # 14 4.3  3 1.1 0.1
      
      # and 4.3 + 3.0 + 1.1 + 0.1 = 8.5.
      
      sum(x[x[,1]==4.3,])
      
      # [1] 8.5
      
      
      # There are four rows where x1 = 6.9.  Those rows are:
      
      x[x[,1]==6.9,]
      
      #      x1  x2  x3  x4
      # 53  6.9 3.1 4.9 1.5
      # 121 6.9 3.2 5.7 2.3
      # 140 6.9 3.1 5.4 2.1
      # 142 6.9 3.1 5.1 2.3
      
      # and
      
      # 6.9 + 3.1 + 4.9 + 1.5 +
      # 6.9 + 3.2 + 5.7 + 2.3 +
      # 6.9 + 3.1 + 5.4 + 2.1 +
      # 6.9 + 3.1 + 5.1 + 2.3 = 69.4
      
      sum(x[x[,1]==6.9,])
      
      # [1] 69.4
      

      关于你的新问题,我认为

      transform(x,x1=sort(x1))
      

      仅对第一列进行排序,其他列保持不变,在这种情况下,您正在更改数据集。

      4.3+3.5+1.4+0.2=9.4

      #      x1  x2  x3  x4
      # 1   4.3 3.5 1.4 0.2
      # 2   4.4 3.0 1.4 0.2
      # 3   4.4 3.2 1.3 0.2
      # 4   4.4 3.1 1.5 0.2
      # 5   4.5 3.6 1.4 0.2
      

      如果您想通过增加第一列的值来对数据集进行排序而不更改数据集,请使用:

      x[order(x$x1),]
      
      #      x1  x2  x3  x4
      # 14  4.3 3.0 1.1 0.1
      # 9   4.4 2.9 1.4 0.2
      # 39  4.4 3.0 1.3 0.2
      # 43  4.4 3.2 1.3 0.2
      # 42  4.5 2.3 1.3 0.3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2011-08-12
        • 2017-06-11
        • 2018-03-05
        • 2023-03-27
        • 2013-05-12
        • 1970-01-01
        相关资源
        最近更新 更多