楼主: lanhong1993
1164 9

[问答] 求助!!如何筛选时间。 [推广有奖]

  • 1关注
  • 1粉丝

已卖:286份资源

博士生

54%

还不是VIP/贵宾

-

威望
0
论坛币
2701 个
通用积分
3.4261
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
12167 点
帖子
214
精华
0
在线时间
141 小时
注册时间
2016-11-1
最后登录
2024-3-26

楼主
lanhong1993 发表于 2017-2-7 13:57:51 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
比如我有两个数据框data如下:
id              time                      outcome      
2     2016/02/03 14:23:00           78            
2     2016/02/03 15:24:00           89
2     2016/02/03 18:44:00           90
2     2016/02/04 08:23:00           77
2     2016/02/04 12:33:00           100
2     2016/02/05 09:12:00           108
2     2016/02/06 14:25:00           103
3     2016/03/12 13:26:00           100           
3     2016/03/12 15:35:00           99
3     2016/03/13 17:46:00           98
4     2016/03/03 16:23:00           109           
4     2016/03/03 19:55:00           95
4     2016/03/04 20:25:00           93
4     2016/03/04 14:23:00           87
4     2016/03/04 17:20:00           113
5     2016/02/08 14:23:00           106           
5     2016/02/08 15:24:00           80
......               ......                       ......
我想筛选出每个id中,时间最迟的那一行,也就是 每个id的最后一行。这用R如何做到呢?
我的代码是这样的:data %>%
                                  gourp_by(id) %>%
                                  filter(max(time))
运行结果报错,说time变量是factor,不能用max函数。还有其他方法么?

二维码

扫码加我 拉你入群

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

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

关键词:outcome factor filter Facto time 如何

沙发
不懂不装懂 发表于 2017-2-7 20:38:19
  1. library(dplyr)
  2. data %>%
  3. group_by(id) %>%
  4. arrange(id,time)%>%
  5.   slice(n())
复制代码

藤椅
lanhong1993 发表于 2017-2-7 21:15:57
不懂不装懂 发表于 2017-2-7 20:38
谢谢!这个slice()函数好神奇!另外再请教一个问题:比如我有两个数据框data1如下:
id          time1                  outcome1      
2     2016/02/03 14:23:00           78            
2     2016/02/03 15:24:00           89
2     2016/02/03 18:44:00           90
2     2016/02/04 08:23:00           77
2     2016/02/04 12:33:00           100
2     2016/02/05 09:12:00           108
2     2016/02/06 14:25:00           103
3     2016/03/12 13:26:00           100           
3     2016/03/12 15:35:00           99
3     2016/03/13 17:46:00           98
4     2016/03/03 16:23:00           109           
4     2016/03/03 19:55:00           95
4     2016/03/04 20:25:00           93
4     2016/03/04 14:23:00           87
4     2016/03/04 17:20:00           113
5     2016/02/08 14:23:00           106           
5     2016/02/08 15:24:00           80

...           ...                   ...           ...
数据框data2如下:
id          time2                  outcome2      
2     2016/02/03 15:28:00           1.3            
2     2016/02/03 15:40:00           1.8
2     2016/02/03 18:44:00           2.0
2     2016/02/04 08:23:00           2.1
3     2016/02/04 12:33:00           2.1
3     2016/02/05 09:12:00           1.2
3     2016/02/06 14:25:00           1.1
3     2016/03/12 13:26:00           0.9           
3     2016/03/12 15:35:00           1.4
3     2016/03/13 17:46:00           1.3
4     2016/03/03 16:23:00           1.8           
4     2016/03/03 19:55:00           2.3
4     2016/03/04 20:25:00           2.3
5     2016/03/04 14:23:00           1.2
5     2016/03/04 17:20:00           1.0
5     2016/02/08 14:23:00           2.6           
5     2016/02/08 15:24:00           2.2

...           ...                   ...           ...

其中,两个数据框中每个id的数量不相等,我想将两个数据框合并,并且要删除data2中时间迟于data1中的行(针对每个id而言),也就是说,对于每一个id而言,data2中的事件都要发生在data1之前,发生在data1之后的数据不需要。那么我的思路是这样的:先在data1中筛选出,每个id最迟的那个时间,形成这样的data frame:
id    time1   outcome1
2    .......     ........
3    .......     .......
4    .......     .......
然后用merge与data2合并,比较time1和time2列,讲time2>time1的行都删除。可是问题来了,time1和time2都是factor,无法进行比较。那么我又将他们用as.POSIXLt()函数来转换,但是转换之后还是无法比较,这该怎么办呢?

板凳
不懂不装懂 发表于 2017-2-7 22:13:53
  1. 转换之后可以比较
  2. as.POSIXct("2016-02-03 14:23:00")<as.POSIXct("2016-02-06 14:25:00")
  3. [1] TRUE
复制代码

报纸
不懂不装懂 发表于 2017-2-7 22:18:56
你可能是转换少了一个步骤,as.POSIXct(as.character(data$time))

地板
不懂不装懂 发表于 2017-2-7 22:21:22
实际可以先筛选,再合并

7
lanhong1993 发表于 2017-2-7 22:52:12
不懂不装懂 发表于 2017-2-7 22:18
你可能是转换少了一个步骤,as.POSIXct(as.character(data$time))
好神奇,as.POSIXct(as.character(data$time))可以比较,而as.POSIXct()却不行,这是为什么?

8
不懂不装懂 发表于 2017-2-7 23:13:35
这里data$time是因子类型,as.POSIXct()不能转换,需先转换成字符

9
lanhong1993 发表于 2017-2-7 23:27:23 来自手机
不懂不装懂 发表于 2017-2-7 23:13
这里data$time是因子类型,as.POSIXct()不能转换,需先转换成字符
喔喔,谢谢大神啦!膜拜!

10
lanhong1993 发表于 2017-2-8 15:03:49
lanhong1993 发表于 2017-2-7 23:27
喔喔,谢谢大神啦!膜拜!
筛选成功后,我想把这两个数据框进行合并,
比如我有两个数据框data1如下:
id          time1                        outcome1      
2     2016/02/03 14:23:00           78            
2     2016/02/03 15:24:00           89
2     2016/02/03 18:44:00           90
2     2016/02/04 08:23:00           77
2     2016/02/04 12:33:00           100
2     2016/02/05 09:12:00           108
2     2016/02/06 14:25:00           103
3     2016/03/12 13:26:00           100           
3     2016/03/12 15:35:00           99
3     2016/03/13 17:46:00           98
4     2016/03/03 16:23:00           109           
4     2016/03/03 19:55:00           95
4     2016/03/04 20:25:00           93
4     2016/03/04 14:23:00           87
4     2016/03/04 17:20:00           113
5     2016/02/08 14:23:00           106           
5     2016/02/08 15:24:00           80

...           ...                   ...           ...
数据框data2如下:
id          time2                         outcome2      
2     2016/02/03 15:28:00           1.3            
2     2016/02/03 15:40:00           1.8
2     2016/02/03 18:44:00           2.0
2     2016/02/04 08:23:00           2.1
3     2016/02/04 12:33:00           2.1
3     2016/02/05 09:12:00           1.2
3     2016/02/06 14:25:00           1.1
3     2016/03/12 13:26:00           0.9           
3     2016/03/12 15:35:00           1.4
3     2016/03/13 17:46:00           1.3
4     2016/03/03 16:23:00           1.8           
4     2016/03/03 19:55:00           2.3
4     2016/03/04 20:25:00           2.3
5     2016/03/04 14:23:00           1.2
5     2016/03/04 17:20:00           1.0
5     2016/02/08 14:23:00           2.6           
5     2016/02/08 15:24:00           2.2

...           ...                   ...           ...

其中,两个数据框中每个id的数量不相等,如何将两个数据框合并成如下形式呢?

id             time1              outcome1              time2               outcome2
2   2016/02/03 14:23:00     78       2016/02/03 15:28:00           1.3     
2   2016/02/03 15:24:00     89       2016/02/03 15:40:00           1.8
2   2016/02/03 18:44:00     90       2016/02/03 18:44:00           2.0
2   2016/02/04 08:23:00     77       2016/02/04 08:23:00           2.1
2   2016/02/04 12:33:00     100      NA                                    NA
2   2016/02/05 09:12:00     108      NA                                    NA
2   2016/02/06 14:25:00     103      NA                                    NA
3   2016/03/12 13:26:00     100      2016/02/04 12:33:00           2.1     
3   2016/03/12 15:35:00     99       2016/02/05 09:12:00           1.2
3   2016/03/13 17:46:00     98       2016/02/06 14:25:00           1.1
3   NA                               NA       2016/03/12 13:26:00           0.9   
3   NA                               NA       2016/03/12 15:35:00           1.4
3   NA                               NA       2016/03/13 17:46:00           1.3
4   2016/03/03 16:23:00     109      2016/03/03 16:23:00           1.8      
4   2016/03/03 19:55:00     95       2016/03/03 19:55:00            2.3
4   2016/03/04 20:25:00     93       2016/03/04 20:25:00            2.3
4   2016/03/04 14:23:00     87        NA                                     NA
4   2016/03/04 17:20:00     113      NA                                     NA
5   2016/02/08 14:23:00     106      2016/03/04 14:23:00           1.2
5   2016/02/08 15:24:00     80        2016/03/04 17:20:00           1.0
5   NA                                NA       2016/02/08 14:23:00           2.6   
5   NA                                NA       2016/02/08 15:24:00           2.2

...           ...                   ...           ...

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-9 19:56