楼主: 0029948968
2651 7

[有偿编程] 请问如何创建这样新的一列数据? [推广有奖]

  • 0关注
  • 0粉丝

大专生

80%

还不是VIP/贵宾

-

威望
0
论坛币
860 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
158 点
帖子
8
精华
0
在线时间
119 小时
注册时间
2019-1-31
最后登录
2021-8-8

200论坛币
对ID进行分组,然后这个ID看的节目如果持续时间小于30分钟则和上一个节目属于同一组(创建新的一列,列名是session),如果超过了30分钟就是新的一组,以此类推。
如图,这种格式。
请问有大佬能用dplyr或者tapply创建这样的一列数据吗?因为数据量非常大,所以要用包来处理,不能用循环和ifelse。有偿,可以增加论坛币,谢谢了! 微信图片_20191106010551.jpg

最佳答案

沙发
skyfx 发表于 2019-11-6 01:06:28 |只看作者 |坛友微信交流群
  1. llibrary(dplyr)
  2. library(zoo)

  3. out <- data %>%
  4.   group_by(id) %>%
  5.   mutate(session = 1:length(jiemu), session0 = session) %>%
  6.   mutate(session = ifelse(time <=20 & session0 != 1, NA, session)) %>%
  7.   mutate(session = na.locf(session, na.rm = F)) %>%
  8.   select(-session0)
复制代码

使用道具

藤椅
Whig 在职认证  发表于 2019-11-6 10:10:20 来自手机 |只看作者 |坛友微信交流群
0029948968 发表于 2019-11-6 01:06
对ID进行分组,然后这个ID看的节目如果持续时间小于30分钟则和上一个节目属于同一组(创建新的一列,列名是 ...
这个感觉比较简单的,如果数据量很大,可能得用data.table

使用道具

板凳
0029948968 发表于 2019-11-6 11:08:10 |只看作者 |坛友微信交流群
Whig 发表于 2019-11-6 10:10
这个感觉比较简单的,如果数据量很大,可能得用data.table
啊,我老师说让我用dplyr或者tapply,不知道怎么弄。。

使用道具

报纸
0029948968 发表于 2019-11-6 13:41:50 |只看作者 |坛友微信交流群
skyfx 发表于 2019-11-6 13:08
非常感谢您的回答,可是这样写出来的session不是按照12345顺序排列的,请问如何让他显示不同的组是按照1、2、3、4...排列的呢?非常感谢! 微信图片_20191106134008.png

使用道具

地板
skyfx 发表于 2019-11-6 15:58:44 |只看作者 |坛友微信交流群
0029948968 发表于 2019-11-6 13:41
非常感谢您的回答,可是这样写出来的session不是按照12345顺序排列的,请问如何让他显示不同的组是按照1、 ...
你附上一些数据作为附件吧,说不清楚。

使用道具

7
0029948968 发表于 2019-11-6 16:08:37 |只看作者 |坛友微信交流群
skyfx 发表于 2019-11-6 15:58
你附上一些数据作为附件吧,说不清楚。
数据样例.rar (4.47 KB)

example是包含了正确session分组的数据,sample是原始数据。
转换是这样的,就是比如同一个ID下的session分了6个组,那就把数据转换为1~6,而不是显示1、7、13、14、16、20这样的不连续的数据。
非常谢谢您

使用道具

8
skyfx 发表于 2019-11-6 16:37:57 |只看作者 |坛友微信交流群
你看下我在另一个帖子的回复,应该可以了。

使用道具

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

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

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

GMT+8, 2024-4-20 01:52