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.3
,x1 + 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
?
答案 0 :(得分:8)
~
中的{p> 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行的条目总和的结果。
答案 1 :(得分:5)
tilde operator创建了一个符号公式。这是blog post的摘录,它比我更好地解释了它:
f =价格〜克拉
[...]
我们首先使用看起来很奇怪的代字号运算符创建公式f。这告诉R解释器我们正在定义一个符号公式,而不是一个立即评估的表达式。因此,我们对公式f的定义说,“价格是克拉的函数”。
formula上的手册页有更多关于代字号操作符的说法。
答案 2 :(得分: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