首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >data.frame中每个组的平均值

data.frame中每个组的平均值
EN

Stack Overflow用户
提问于 2014-02-24 16:57:00
回答 3查看 610.9K关注 0票数 200

我有一个data.frame,我需要计算每个组的平均值(即每个Month,如下所示)。

代码语言:javascript
复制
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

我想要的输出如下所示,其中Rate1Rate2的值是组平均值。请忽略它的值,我已经为这个例子虚构了它。

代码语言:javascript
复制
Name       Rate1       Rate2
Aira        23.21       12.2
Ben         45.23       43.9
Cat         33.22       32.2
EN

回答 3

Stack Overflow用户

发布于 2014-02-24 17:06:01

您还可以使用package plyr,它在某种程度上更加通用:

代码语言:javascript
复制
library(plyr)

ddply(d, .(Name), summarize,  Rate1=mean(Rate1), Rate2=mean(Rate2))

  Name    Rate1    Rate2
1 Aira 16.33333 47.00000
2  Ben 31.33333 50.33333
3  Cat 44.66667 54.00000
票数 41
EN

Stack Overflow用户

发布于 2014-02-25 11:57:18

第三个很好的选择是使用包data.table,它也有类data.frame,但是像您正在寻找的操作的计算速度要快得多。

代码语言:javascript
复制
library(data.table)
mydt <- structure(list(Name = c("Aira", "Aira", "Aira", "Ben", "Ben", "Ben", "Cat", "Cat", "Cat"), Month = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), Rate1 = c(15.6396600443877, 2.15649279424609, 6.24692918928743, 2.37658797276116, 34.7500663272292, 3.28750138697048, 29.3265553981065, 17.9821839334431, 10.8639802575958), Rate2 = c(17.1680489538369, 5.84231656330206, 8.54330866437461, 5.88415184986176, 3.02064294862551, 17.2053351400752, 16.9552950199166, 2.56058000170089, 15.7496228048122)), .Names = c("Name", "Month", "Rate1", "Rate2"), row.names = c(NA, -9L), class = c("data.table", "data.frame"))

现在取所有3个月的Rate1和Rate2的平均值,对于每个人(姓名):首先,确定您想要取哪些列的平均值

代码语言:javascript
复制
colstoavg <- names(mydt)[3:4]

现在我们使用lapply对我们想要平均的列取平均值(colstoavg)

代码语言:javascript
复制
mydt.mean <- mydt[,lapply(.SD,mean,na.rm=TRUE),by=Name,.SDcols=colstoavg]

 mydt.mean
   Name     Rate1     Rate2
1: Aira  8.014361 10.517891
2:  Ben 13.471385  8.703377
3:  Cat 19.390907 11.755166
票数 22
EN

Stack Overflow用户

发布于 2016-02-05 09:58:43

您还可以使用不带截取的泛型函数cbind()lm()

代码语言:javascript
复制
cbind(lm(d$Rate1~-1+d$Name)$coef,lm(d$Rate2~-1+d$Name)$coef)
>               [,1]     [,2]
>d$NameAira 16.33333 47.00000
>d$NameBen  31.33333 50.33333
>d$NameCat  44.66667 54.00000
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21982987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档