gpt4 book ai didi

r - 汇总每月状态数据以排序数据

转载 作者:行者123 更新时间:2023-12-04 11:15:25 24 4
gpt4 key购买 nike

我想知道是否有一个简单的解决方案来解决以下问题:想象一下每月处理有关某人是否工作 (work=1) 或不工作 (work=0) 的状态信息。这说明了原始数据:

    orig <- data.frame(id=c(rep(1:2, each=10)), 
month.nr=c(rep(1:10,2)),
work.yn=c(0,1,1,0,0,0,1,1,1,0,
1,1,1,1,0,1,1,0,0,1))
id month.nr work.yn
1 1 0
1 2 1
1 3 1
1 4 0
1 5 0
1 6 0
1 7 1
1 8 1
1 9 1
1 10 0
2 1 1
2 2 1
2 3 1
2 4 1
2 5 0
2 6 1
2 7 1
2 8 0
2 9 0
2 10 1

我正在寻找一个简单的函数或算法来转换数据,仅保留工作周期的开始和结束月份,并按人员 (id) 对结果序列进行编号。上述示例的结果数据如下所示:

    id month.start.work month.end.work sequence.nr
1 2 3 1
1 7 9 2
2 1 4 1
2 6 7 2
2 10 10 3

由于我的数据量不是那么小,因此非常感谢资源高效的解决方案。

编辑:使用循环(可能还有滞后函数)完成任务会奏效,但我正在寻找更矢量化的解决方案。

最佳答案

这里有一些类似的解决方案,在 data.table v >= 1.9.6(最新的稳定版本)中使用 rleid 函数

library(data.table) # v.1.9.6+
setDT(orig)[, indx := rleid(work.yn)
][work.yn != 0, .(start = month.nr[1L],
end = month.nr[.N]),
by = .(id, indx)
][, seq := 1:.N,
by = id][]
# id indx start end seq
# 1: 1 2 2 3 1
# 2: 1 4 7 9 2
# 3: 2 6 1 4 1
# 4: 2 8 6 7 2
# 5: 2 10 10 10 3

上面的轻微变体,无需先创建 index,从而避免了一次分组操作:

setDT(orig)[, if (work.yn[1L]) 
.(start=month.nr[1L], end=month.nr[.N]),
by=.(id, rleid(work.yn))
][, seq := seq_len(.N), by=id][]

或者我们可以使用 range 来获得更短的代码

setDT(orig)[, if (work.yn[1L]) as.list(range(month.nr)), 
by = .(id, rleid(work.yn))
][, seq := seq_len(.N), by = id][]

关于r - 汇总每月状态数据以排序数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32986378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com