作者fox1375 (阿吠)
看板R_Language
标题Re: [问题] 依变项分组的加总
时间Sun Dec 5 11:08:28 2021
下面的讨论是错在细节
语法非常简单,但一些基本观念要先知道
之後才不会重复犯错
※ 引述《cheen885 ()》之铭言:
: 标题: 依变项分组的加总
: 时间: Fri Dec 3 18:24:00 2021
:
: 各位大大好,不好意思
:
: 想请问
:
: 我手边有一组资料
:
: https://i.imgur.com/w453bWR.jpg
:
:
:
: 因为想依照日期(date)、医师(doctor )、诊间时段(TimeofPeriod)分群,将最右
: 栏的premodel108个数值累加
:
: 但是希望可以是 X1-X7、X8-X15的数值分别累加
:
: 我打的程式码是:
:
: file<-mutate(group_by(file,date,doctor,TimeofPeriod),cum=cumsum(predmodel108
: ))
:
: 做出来的却是 X1-X15的累加QQ
其实就如celestialgod大所说,这个应该是对的
等价於
file %>%
group_by(date, doctor, TimeofPeriod) %>%
mutate(cum=cumsum(predmodel108))
原PO可以再确认看看
我主要针对下面的讨论回覆
:
: 想请问我的程式码应如何修正呢
:
: 谢谢大家QQQQ
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 101.9.114.174 (台湾)
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1638527042.A.383.html
: ※ 编辑: cheen885 (101.9.114.174 台湾), 12/03/2021 18:26:59
: 推 locka: file <- file %>% group_by(date, doctor,TimeofPeeiod) %> 12/03 18:43
: 推 locka: % summarise(sum=sum(premodel108) 12/03 18:43
: 推 locka: 然後既然都用 dplyr 了 就用 pipeline 吧 巢状的程式码不好 12/03 18:43
: 推 locka: 阅读 12/03 18:43
此处locka大用summarise,其实mutate和summarise是都可以
但後面误会原PO的意思
新变项是分组後「逐笔资料」的累加,而不是各小组的累加
应用cumsum而非sum
例如资料a:
gp val
1 1 10
2 1 20
3 1 30
4 2 10
5 2 20
用a %>% group_by(gp) %>% summarise(new = sum(val))的话会变成
gp new
1 1 60
2 2 30
而原PO要的则是a %>% group_by(gp) %>% summarise(new = cumsum(val))
gp new
1 1 10
2 1 30
3 1 60
4 2 10
5 2 30
: 呜谢谢你!!那麽快速回复我好感动
: 不过想请问我跑出来长这样...
: https://i.imgur.com/5mqEZ02.jpg
: 应该如何处理呢QQ
: 谢谢你
注意除了sum以外,原PO这里细节上也犯了一个错
你赋值的对象是
final09a_new$PTT,而非final09a_new
final09a_new$PTT是一个变项而已
但是右边的内容final09a_new %>% group_by %>% summarise()
是一个资料集
错误1.把一个资料集赋值进一个变项,硬套是可以套进去,但绝对不是原PO要的
错误2.如上面的例子,用sum的话资料列数会变成分组组数
所以final09a_new$PTT的长度会是final09a_new的列数
右边的内容则只有341列(因为你分成341组了)
用summarise有一个问题是,运算出来的dataset会只剩下分组变项
例如上面的例子,原本的val就不见了
如果原PO要保留非分组变项,只希望多一个栏位
建议还是用mutate
: ※ 编辑: cheen885 (101.9.114.174 台湾), 12/03/2021 21:29:11
: → locka: 看错误讯息是资料笔数对不起来,剩下没有可重现错误的资料 12/03 21:49
: → locka: 爱莫能助(耸肩 12/03 21:49
: 推 Gjerry: 其实可以考虑用 split 切开 data frame 等用 lapply 处理 12/03 23:38
: → Gjerry: 完再合起来,对於不熟悉的人来说应该比较直觉 12/03 23:38
: → locka: G大 其实我觉得 lapply 也没有很直观耶XDDD 12/04 00:06
: 推 chenwz: 因为group_by 分组後的列数跟原本资料对不起来,所以没办 12/04 09:19
: → chenwz: 法直接给新栏位。可以重给一个df, 再join起来 12/04 09:19
: 推 Gjerry: 不然用 for loop 也可以,一开始就学 dplyr 我觉得会有点 12/04 15:30
: → Gjerry: 卡卡的 12/04 15:30
: 推 celestialgod: 我觉得原PO一开始就写对了 原PO要不要检查一下资料 12/05 01:09
: → celestialgod: ? 12/05 01:09
: → celestialgod: https://reurl.cc/2oqm5X 12/05 01:09
: → celestialgod: 不然试试看data.table 12/05 01:09
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.109.196.250 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1638673712.A.1FF.html
※ 编辑: fox1375 (140.109.196.250 台湾), 12/05/2021 11:09:35
1F:推 locka: 推fox大,我昨天在捷运上看太快,是我没正确理解问题就回覆 12/05 12:44
2F:→ locka: 原来原po要的是累加…(突然觉得好丢脸QQ) summarise的确是 12/05 12:45
3F:→ locka: 单纯用在分组後加总的情况。另外没想到F大竟然还观察到赋值 12/05 12:45
4F:→ locka: 对象错误的小细节,请受小弟一拜m(_ _)m 12/05 12:45
5F:→ locka: 不过还是觉得很奇怪,如果原本写的是对的怎麽会跑出非预期 12/05 12:50
6F:→ locka: 的结果(搔头) 12/05 12:50
这个要原PO提供完整程式码才能判断了
以结果来说显然是group_by没有依预期的方式运作
可能是使用错误、版本问题或套件的冲突导致
例如同时使用dplyr和plyr两个套件就会这样
顺便宣导所有plyr的功能dplyr都可以完成
plyr已停止更新,不应再使用
※ 编辑: fox1375 (140.109.196.250 台湾), 12/05/2021 13:24:33
7F:推 cheen885: 谢谢f大!!我有在我的原文补上完整的程式码,我後来一 12/06 20:44
8F:→ cheen885: 直重跑,发现还是一直跑错,一直找不到内文的照片我到 12/06 20:44
9F:→ cheen885: 底要跑对的XD,後来听取您的建议,不使用plyr的套件, 12/06 20:44
10F:→ cheen885: 我就成功跑出我要的结果了!!真的很感谢你的帮忙:D!! 12/06 20:44