作者locka (locka)
看板R_Language
标题[问题] data frame分群问题
时间Wed Feb 22 08:14:33 2017
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
请把以下不需要的部份删除
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
大家好:
我有一个data table,其中有一个栏位叫做round,记录每次实验的数据
大概长这个样子:
round y
1: 1 19.7
2: 1 7.86
3: 2 8.95
4: 2 10.07
5: 2 15.20
---
10419: 3000 11.81
10420: 3000 8.46
10421: 3000 9.17
想要每 30 round分为一组,计算y的平均
也就是 round 1:30为一组,31:60为第二组...总共有100组
想像中用dplyr的做法应该是
mydt %>% group_by(...) %>% summarise(mean_y=mean(y))
或是新增一个叫做group的栏位
mydt %>% mutate(group=[每30round为一组的写法]) %>%
group_by(group) %>% summarise(mean_y=mean(y))
可是就是卡在不知道group_by或是mutate里面不知道怎麽写比较恰当
感觉没有很难但实在不知道该从何做起,所以上来请教大家的想法
先谢谢大家了!
[关键字]:
group_by, data frame, 分组
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.160.8.213
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1487722475.A.974.html
※ 编辑: locka (118.160.8.213), 02/22/2017 08:18:42
1F:→ cywhale: mutate(grp=1+as.integer(round-1)/30) 02/22 08:51
抱歉我可能描述的不够清楚
我总共有3000个回合的资料,每个回合产生的y笔数为1-6笔不等
我想要做的是取第1到第30回合(round栏位为1到30者)当第1组
第31到60回合为第2组,第61到90回合为第3组...第2971-3000回合为第100组
去计算各组里面y的平均
所以预期结果是要产生"100笔"分组的平均资料
cywhale大大感谢您的回覆,我试过您的作法,可是结果还是不太对>"<
照您的做法产生的是3000笔平均(ie.每个回合内y的平均)
※ 编辑: locka (118.160.8.213), 02/22/2017 15:42:28
1600 update: hi,我现在试出一个做法如下:
lapply(seq(1,3000,100),function(start){
end <- start+30
mydt <- filter(round %in% c(start,end)) %>% summarise(mean(y))
}) %>% unlist(use.names=F)
变成计算先要取的round是几到几,然後从原资料filter出来後计算平均,
最後再unlist
感觉有点蠢QQ
总觉得应该有data.table的写法
请大家指教>"<
※ 编辑: locka (118.160.8.213), 02/22/2017 16:10:37
2F:推 cywhale: 我觉得我说的没错?先产生group(如上回覆)再去组内平均 02/22 16:14
3F:→ cywhale: DT[,grp:=rp=1+as.integer(round-1)/30] %>% .[,mean(y), 02/22 16:15
4F:→ cywhale: by=grp] 就是做组内平均,dplyr用mutate接着根据grp平均 02/22 16:17
可是执行as.integer(round-1)/30 不是把round除30吗?(先不考虑前面的+1)
这样商会有0,0.033,0.066,1,1.33...一直到最後一个值是1
商只会越来越大, 总共会有3000组商
那这样这样的分组结果跟单纯用round分组是一样的不是吗?
我要的不是依照round分组 是想要每30 round分一组而且要照顺序
参考您的作法
我有试过as.integer(round-1)%%100 用取余数的方法分成100组
可是这样的话就会变成第一组是(1,101,201,301,...2901)这些回合的平均
第二组是(2,201,202,302...2902)...
虽然每组也是30个round但不是我想要的(1,2,3...30),(31,32,33,34..60),
(2971,2972,2973,...3000)...
※ 编辑: locka (118.160.8.213), 02/22/2017 16:32:25
5F:推 cywhale: 我没注意到我括号打错位置..1+as.integer((round-1)/30) 02/22 17:20
噢噢!!我看懂了!!无条件舍弃小数点,直接依照整数部分来分组
这方法要学起来...(笔记)
那这样就没错了,十分感谢cywhale大大,thanks!!
※ 编辑: locka (118.160.8.213), 02/22/2017 17:55:19
6F:→ celestialgod: findInterval(1:3000, seq(1, 3000, by = 30)) 02/22 20:08
7F:→ celestialgod: 分群可以用上面指令 02/22 20:08
8F:→ likuyun: 先建立分群序列seq_group<-seq(0,100,by=1)*30+1 02/24 22:15
9F:→ likuyun: cut(round,seq_group,seq_group[1:(length(seq_group)-1) 02/24 22:17
10F:→ likuyun: ]) 02/24 22:17
11F:→ likuyun: 跑出来的向量就是分群好的结果,1~30会给1、31~60会给31 02/24 22:20