我有两列的数据框。第一列包含诸如“第一”,“第二”,“第三”之类的类别,第二列具有代表我从“类别”中看到特定组的次数的数字。
例如:
Category Frequency
First 10
First 15
First 5
Second 2
Third 14
Third 20
Second 3
我想按类别对数据进行排序,并对所有频率求和:
Category Frequency
First 30
Second 5
Third 34
我将如何在R中执行此操作?
使用aggregate
:
aggregate(x$Frequency, by=list(Category=x$Category), FUN=sum)
Category x
1 First 30
2 Second 5
3 Third 34
在上面的示例中,可以在中指定多个尺寸list
。可以通过cbind
以下方式合并同一数据类型的多个汇总指标:
aggregate(cbind(x$Frequency, x$Metric2, x$Metric3) ...
(嵌入@thelatemail评论),aggregate
也具有公式界面
aggregate(Frequency ~ Category, x, sum)
或者,如果你想汇总多列,则可以使用.
表示法(也适用于一列)
aggregate(. ~ Category, x, sum)
或tapply
:
tapply(x$Frequency, x$Category, FUN=sum)
First Second Third
30 5 34
使用此数据:
x <- data.frame(Category=factor(c("First", "First", "First", "Second",
"Third", "Third", "Second")),
Frequency=c(10,15,5,2,14,20,3))
@AndrewMcKinlay,R使用波浪号来定义符号公式,以用于统计和其他功能。可以将其解释为“按类别划分的模型频率”或“取决于类别的频率”。并非所有语言都使用特殊的运算符来定义符号函数,就像在R中所做的那样。也许通过波浪号运算符的“自然语言解释”,它变得更加有意义(甚至直观)。我个人发现此符号公式表示形式比一些更详细的替代方案更好。
作为R的新手(并提出与OP相同的问题),我将从每个替代方法后面的语法的更多细节中受益。例如,如果我有一个较大的源表,并且想只选择两个维度以及加总的指标,我可以采用其中任何一种方法吗?很难说。
无论如何,要维护一个ID列吗?假设类别是有序的,并且ID
1:nrow(df)
列为,是否可以在汇总后保持每个类别的起始位置?因此,在与合计合拢后,ID列将以例如1、3、4、7结尾。就我而言,我喜欢aggregate
它,因为它可以自动处理许多列。