请选择 进入手机版 | 继续访问电脑版
楼主: falseform
5592 10

[学习分享] 如何实现groupby,summarize之后返回当前行其他列的值 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

30%

还不是VIP/贵宾

-

威望
0
论坛币
18844 个
通用积分
1.1873
学术水平
2 点
热心指数
0 点
信用等级
0 点
经验
4941 点
帖子
91
精华
0
在线时间
133 小时
注册时间
2017-9-19
最后登录
2019-8-15

falseform 发表于 2018-1-16 10:25:00 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
顺序ID主Id报告日期得分

1

47

2017/2/4

50

2

47

2017/2/11

30

3

47

2017/2/18

24

4

47

2017/2/25

18

5

49

2017/2/9

40

6

49

2017/2/16

31

7

49

2017/2/23

17

8

51

2017/2/3

35

9

53

2015/5/5

28

10

53

2015/5/12

20

11

53

2015/5/19

17

12

55

2017/1/21

31

13

55

2017/1/28

8

14

57

2017/1/13

35

15

57

2017/1/20

32

16

67

2017/1/7

19

17

67

2017/1/14

13

18

67

2017/1/21

5

如上源数据,我想得到同一个主ID最早一天的分数和最晚一天的分数,最终实现结果是最下面的表格,

group_by(df,主Id) %>% summarise('最晚'=max(报告日期),'最早'=min(报告日期))
现在我用上面的代码只能实现前三列,我想问下summarize能不能实现返回当前行的其他列的值呢,

     主Id        最晚        最早      最早分数     最晚分数
   <int>     <date>     <date> <dbl>
1    47 2017-02-25 2017-02-04    18            xx
2    49 2017-02-23 2017-02-09    17           xx
3    51 2017-02-03 2017-02-03    35           xx
4    53 2015-05-19 2015-05-05    17           xx
5    55 2017-01-28 2017-01-21     8           xx
6    57 2017-01-20 2017-01-13    32           xx
7    67 2017-01-21 2017-01-07     5           xx
8    69 2016-12-03 2015-03-27    40           xx
9    73 2017-01-18 2017-01-11    11           xx
10    75 2017-01-12 2017-01-05     2           xx

二维码

扫码加我 拉你入群

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

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


ntsean 发表于 2018-1-16 11:54:44 |显示全部楼层 |坛友微信交流群
  1. data %>%
  2.   arrange(id, date) %>%
  3.   group_by(id) %>%
  4.   summarise(first(date), last(date), first(score), last(score))
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 收起 理由
cheetahfly + 30 + 1 精彩帖子
jiangbeilu + 10 + 1 精彩帖子

总评分: 经验 + 30  论坛币 + 10  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

falseform 发表于 2018-1-16 22:37:51 |显示全部楼层 |坛友微信交流群
ntsean 发表于 2018-1-16 11:54
!!这也行 我试试 ,我用的是非常笨的方法,groupby summarise 之后 用的merge拼接再然后取分数列再mutate上 实在是丢人 哈哈 谢谢

使用道具

falseform 发表于 2018-1-17 11:22:02 |显示全部楼层 |坛友微信交流群
ntsean 发表于 2018-1-16 11:54
编辑了

使用道具

xing035400 在职认证  发表于 2018-1-18 14:25:41 |显示全部楼层 |坛友微信交流群
ntsean 发表于 2018-1-16 11:54
学习了,

使用道具

xing035400 在职认证  发表于 2018-1-18 14:33:14 |显示全部楼层 |坛友微信交流群


谢谢楼上的解答,正好可以拿来学习一遍

summarise+groupby.jpg

summarise groupby.jpg

使用道具

cheetahfly 在职认证  发表于 2018-1-19 00:15:02 |显示全部楼层 |坛友微信交流群
你的思路方向是错的,为什么要用summarise呢?用summarise就意味着要变成新的表,而你的本意不过想是过滤罢了,因此要用filter()
  1. library(tidyverse)
  2. data %>%
  3.   group_by(主ID) %>%
  4.   filter(date %in% range(date)) %>%
  5.   ungroup()
复制代码
用range(date)来找出最早和最迟的一天,没想到吧,这是Hadley Wickham大神在他的书上举例的,再次膜拜。

使用道具

falseform 发表于 2018-1-19 10:52:21 |显示全部楼层 |坛友微信交流群
cheetahfly 发表于 2018-1-19 00:15
你的思路方向是错的,为什么要用summarise呢?用summarise就意味着要变成新的表,而你的本意不过想是过滤罢 ...
666看起来好棒,说真的hadley大神整合的tidyverse包真的是强大,不敢想象如果没有这个包R的竞争力会下降多少

使用道具

falseform 发表于 2018-1-19 11:35:51 |显示全部楼层 |坛友微信交流群
cheetahfly 发表于 2018-1-19 00:15
你的思路方向是错的,为什么要用summarise呢?用summarise就意味着要变成新的表,而你的本意不过想是过滤罢 ...
# A tibble: 13 x 4
   顺序ID  主Id   报告日期  得分
    <int> <int>     <date> <int>
1      1    47 2017-02-04    50
2      4    47 2017-02-25    18
3      5    49 2017-02-09    40
4      7    49 2017-02-23    17
5      8    51 2017-02-03    35
6      9    53 2015-05-05    28
7     11    53 2015-05-19    17
8     12    55 2017-01-21    31
9     13    55 2017-01-28     8
10     14    57 2017-01-13    35
11     15    57 2017-01-20    32
12     16    67 2017-01-07    19
13     18    67 2017-01-21     5

问题又来了,现在用您的代码已经实现了结果,但是我想把结果拆开,变成以下表头,意思就是根据主ID把他拆成两行,我用spread 并不能实现, 这样的话是不是最好解决办法就是新建一个df?,有木有简便函数呢,如果想实现感觉还要groub_by一遍主ID,然后select或者用first,,感觉又回去了....

顺序ID  主Id   报告日期最早  最早得分  报告日期最晚  最晚得分

使用道具

cheetahfly 在职认证  发表于 2018-1-19 17:02:53 |显示全部楼层 |坛友微信交流群
falseform 发表于 2018-1-19 11:35
# A tibble: 13 x 4
   顺序ID  主Id   报告日期  得分
你知道为什么想要转成你所想要的数据,会挺“别扭”吗?
因为你的目标不是一个"tidy data",什么是tidy data?可以参照Hadley Wickham写的相关论文。HW编写的这些包,都是为了对tidy data进行变形的,所以对你所要求的这种结构显得比较别扭。
建议你把你的目标数据分解成两个tidy的dataframe:
顺序ID  主Id   报告日期最早  最早得分

顺序ID  主Id   报告日期最晚  最晚得分
然后以主Id为key进行merge或join,这样做的好处是逻辑非常清晰,不容易出错,易于维护。

使用道具

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

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

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

GMT+8, 2024-4-19 08:31