楼主: yiqihecai
51340 15

[问答] 如何用r语言分组求均值 [推广有奖]

  • 0关注
  • 0粉丝

高中生

77%

还不是VIP/贵宾

-

威望
0
论坛币
323 个
通用积分
0.1500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
317 点
帖子
13
精华
0
在线时间
51 小时
注册时间
2011-2-16
最后登录
2023-10-2

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
语文  数学   性别
99      98       女
99      97       女
99      97       男
99      96        男

如何按性别分别求均值?

希望的到的结果:
语文 数学 性别
99     97.5  女
99     96.5  男
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 如何用 如何

回帖推荐

cheetahfly 发表于7楼  查看完整内容

是的,tapply只对向量起作用,你找到aggregate确实管用,排版也不错(先多谢),此外,我还可以提供两种方法(都是那本书里的): 不过输出的格式一般像如下: 在你的案例中这两个函数没什么优势,但是如果需要用到summary()这样的函数时,by()和split()的输出排版就有优势了。
沙发
cheetahfly 在职认证  发表于 2015-10-13 14:09:08 |只看作者 |坛友微信交流群
用tapply()函数就能很容易解决,比如:
  1. a<-data.frame(l=c(99,99,78,56,33,27),m=c(98,53,27,56,65,98),s=c("m","f","m","m","f","f"))  # 创建一个测试用数据框
复制代码
看看a,内容如下:
> a  
     l  m s
1 99 98 m
2 99 53 f
3 78 27 m
4 56 56 m
5 33 65 f
6 27 98 f
然后用tapply来算语文(l)的均值
  1. tapply(a[,1],a[,3],mean)
复制代码
返回结果:
       f        m
53.00000 77.66667

推荐你看《R语言编程的艺术》里面有详解


已有 2 人评分经验 论坛币 收起 理由
李会超 + 40 热心帮助其他会员
admin_kefu + 20 热心帮助其他会员

总评分: 经验 + 40  论坛币 + 20   查看全部评分

使用道具

藤椅
yiqihecai 发表于 2015-10-13 14:22:18 |只看作者 |坛友微信交流群
谢谢,因为我想对多列求,而tapply只能对一列求

使用道具

板凳
yiqihecai 发表于 2015-10-13 14:23:54 |只看作者 |坛友微信交流群
我又在网上查了一个方法aggregate(a[,1:2],list(a[,3]),mean)   

使用道具

报纸
yiqihecai 发表于 2015-10-13 14:24:57 |只看作者 |坛友微信交流群
我又在网上查了一个方法aggregate(a[,1:2],list(a[,3]),mean)   

使用道具

地板
蓝色 发表于 2015-10-13 14:53:53 |只看作者 |坛友微信交流群
  1. a<-data.frame(l=c(99,99,78,56,33,27),m=c(98,53,27,56,65,98), s=c("m","f","m","m","f","f"))  
  2. a.mean  <- aggregate(cbind(l, m) ~ s, data = a, FUN = "mean")
  3. a.mean
复制代码

结果
  1. > a<-data.frame(l=c(99,99,78,56,33,27),m=c(98,53,27,56,65,98), s=c("m","f","m","m","f","f"))  
  2. > a.mean  <- aggregate(cbind(l, m) ~ s, data = a, FUN = "mean")
  3. > a.mean
  4.   s        l        m
  5. 1 f 53.00000 72.00000
  6. 2 m 77.66667 60.33333
  7. >
复制代码


已有 2 人评分经验 论坛币 收起 理由
李会超 + 40 热心帮助其他会员
admin_kefu + 20 热心帮助其他会员

总评分: 经验 + 40  论坛币 + 20   查看全部评分

使用道具

7
cheetahfly 在职认证  发表于 2015-10-13 14:55:43 |只看作者 |坛友微信交流群
是的,tapply只对向量起作用,你找到aggregate确实管用,排版也不错(先多谢),此外,我还可以提供两种方法(都是那本书里的):

  1. # 方法一,用split函数
  2. lapply(split(a[,1:2],a$s),colMeans)
  3. # 方法二,用by函数
  4. by(a[,1:2],a$s,colMeans)
复制代码

不过输出的格式一般像如下:
  1. a$s: f
  2. l  m
  3. 53 72
  4. -----------------------------------------------------
  5. a$s: m
  6.        l        m
  7. 77.66667 60.33333
复制代码
在你的案例中这两个函数没什么优势,但是如果需要用到summary()这样的函数时,by()和split()的输出排版就有优势了。
已有 1 人评分经验 收起 理由
李会超 + 40 精彩帖子

总评分: 经验 + 40   查看全部评分

使用道具

8
fcfc2013 发表于 2015-10-14 10:28:02 |只看作者 |坛友微信交流群
学习了

使用道具

9
李会超 发表于 2015-10-15 12:17:51 |只看作者 |坛友微信交流群
用dplyr包吧

使用道具

10
ntsean 发表于 2015-10-16 07:11:53 |只看作者 |坛友微信交流群
library(dplyr)
group_by(data, sex) %>% summarize_each(funs(mean), var1, var2, var3...)
已有 1 人评分经验 学术水平 收起 理由
oliyiyi + 100 + 5 精彩帖子

总评分: 经验 + 100  学术水平 + 5   查看全部评分

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 22:50