2
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.3x1 + x2 + x3 + x4 is not 3.5+1.4+0.2=5.1,nor 4.3+3.5+1.4+0.2=9.4?

4

3 回答 3

8

~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 行条目总和的结果。

于 2012-12-29T04:05:19.557 回答
5

波浪号运算符创建一个符号公式。这是一篇博客文章的摘录,它比我能更好地解释它:

f = 价格 ~ 克拉

[...]

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

公式s的手册页对波浪号运算符有更多说明。

于 2012-12-29T04:10:04.650 回答
1

关于你的第二个问题,在 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
于 2012-12-29T04:24:19.073 回答