这个问题在这里已有答案:
我有 data.frame
,我需要计算每组的平均值(即每 Month
,下面) .
Name Month Rate1 Rate2
Aira 1 12 23
Aira 2 18 73
Aira 3 19 45
Ben 1 53 19
Ben 2 22 87
Ben 3 19 45
Cat 1 22 87
Cat 2 67 43
Cat 3 45 32
我想要的输出如下所示,其中 Rate1
和 Rate2
的值是组的意思 . 请忽略这个值,我已经为这个例子做了补充 .
Name Rate1 Rate2
Aira 23.21 12.2
Ben 45.23 43.9
Cat 33.22 32.2
8 回答
这种类型的操作正是
aggregate
的设计目的:在这里,我们聚合data.frame
d
的第3列和第4列,按d$Name
分组,并应用mean
函数 .或者,使用公式界面:
或者使用dplyr包中的
group_by
&summarise_at
:有关指定要操作的变量的多种方法,请参阅
?summarise_at
. 这里,vars(-Month)
表示除Month
之外的所有变量 .你也可以使用包
plyr
,这在某种程度上更通用:第三个很好的选择是使用包
data.table
,它也有类data.frame,但是你正在寻找的操作计算速度要快得多 .现在为每个人(名称)取所有3个月的Rate1和Rate2的平均值:首先,确定您想要取的平均值
现在我们使用lapply来取平均值而不是我们想要的列(colstoavg)
我描述了两种方法,一种基于 data.table ,另一种基于 reshape2 包 . data.table方式已经有了答案,但我试图让它更清洁,更详细 .
数据是这样的:
使用data.table:
还有另一种方法可以避免使用.SD在data.table中为j编写许多参数
如果我们只想要Rate1和Rate2那么我们可以使用.SDcols如下:
以下是基于
R
的各种方法,包括另一种方法aggregate
. 以下示例返回每月的工具,我认为这是您所要求的 . 虽然,可以使用相同的方法返回每人的手段:使用
ave
:使用
by
:使用
lapply
和split
:使用
sapply
和split
:使用
aggregate
:您也可以使用通用函数
cbind()
和lm()
而不使用截距:您也可以使用
sqldf
包完成此操作,如下所示:我最近转换为
dplyr
,如其他答案中所示,但sqldf
很好,因为大多数数据分析师/数据科学家/开发人员至少在SQL中流利 . 通过这种方式,我认为它倾向于提供比dplyr
或上面提出的其他解决方案更普遍可读的代码 .UPDATE: 在回复下面的评论时,我试图更新代码,如上所示 . 但是,这种行为并不像我预期的那样 . 似乎列定义(即
int
vsfloat
)仅在列别名与原始列名匹配时才会执行 . 指定新名称时,将返回聚合列而不进行舍入 .